通信レスポンスのStreamからMemoryStreamへ高速にコピーするには
■やりたいこと
UnityのC#にてリソースが複数入ったTarファイルをダウンロードし、
展開し保存するという処理を書いているのですが
レスポンスで受け取ったデータをMemoryStreamに書き込む時
5Mのファイルを書き込み終わるのに40秒近くかかっており、
どうにかして高速したく調査しています。
Tarファイルは全部で80個で500Mほどあり、
リソースを全て落とすのに1時間ほどかかっています。
この処理はダウンロード中非同期に動作させたいので
別スレッドで動作しています。
Androidでは、これほど時間がかからず10分程で完了しており
iOSでのみ起こっているので、他にも原因があるかもしれないのですが
まずはログを貼って判明したこの現象からつぶしていきたいと思っています。
■質問
・貼り付けたソースのdo~whileで回しているところで5Mのファイルのバイナリーを
MemoryStreamに書き込んでいるのですが、このループを抜けるまでに40秒ほど
掛かっています。
コピーの仕方のまずい点を指摘していただけないでしょうか?
・count = st.Read(buffer, 0, buffer.Length);の戻り値のcountが
16384になり16kバイトづつしか読めてないようなのですが、
このサイズは何を基準算出されるのでしょうか?
●ソースコードを抜粋しています。
using (HttpWebResponse wres = (HttpWebResponse)req.GetResponse())
{
using (Stream st = wres.GetResponseStream())
{
sw.WriteLine("ストリーム書き込み前:" + ((TimeSpan)(DateTime.Now - startTime)).TotalMilliseconds.ToString() + ",");
//Debug.Log("GetResponseStream");
using (MemoryStream memoryStream = new MemoryStream())
{
//Debug.Log("MemoryStream()");
byte[] buffer = new byte[1048576];
int count = 0;
do
{
sw.WriteLine("ストリーム書き込み0:" + ((TimeSpan)(DateTime.Now - startTime)).TotalMilliseconds.ToString() + ",");
// レスポンスデータからread
count = st.Read(buffer, 0, buffer.Length);
sw.WriteLine("ストリーム書き込み1:" + ((TimeSpan)(DateTime.Now - startTime)).TotalMilliseconds.ToString() + ",");
memoryStream.Write(buffer, 0, count);
sw.WriteLine("ストリーム書き込み2:" + ((TimeSpan)(DateTime.Now - startTime)).TotalMilliseconds.ToString() + ",");
} while (count != 0);
memoryStream.Position = 0;
sw.WriteLine("ストリーム書き込み後:" + ((TimeSpan)(DateTime.Now - startTime)).TotalMilliseconds.ToString() + ",");
Tar解凍メソッドへ(memoryStream, false);
}
}
}
■開発環境
Unity5.4.0f3
MacOsX10.11(EL Capitan)
■実行環境
iPhone5S
iOS8.4