質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Q&A

1回答

7656閲覧

StreamとMemoryStream間のバイト書き込みを早くするにはどうすれば良いでしょうか?

MiyamotoSatoshi

総合スコア30

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

0グッド

0クリップ

投稿2016/08/27 05:58

stackオーバーフローにも質問したのですが、
できれば色々な方の意見をお聞きしたくこちらでも質問いたしました。
スタックオーバーフローでの質問

■やりたいこと
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バイトづつしか読めてないようなのですが、
このサイズは何を基準算出されるのでしょうか?

●ソースコードを抜粋しています。

C#

1using (HttpWebResponse wres = (HttpWebResponse)req.GetResponse()) 2{ 3 4 using (Stream st = wres.GetResponseStream()) 5 { 6 sw.WriteLine("ストリーム書き込み前:" + ((TimeSpan)(DateTime.Now - startTime)).TotalMilliseconds.ToString() + ","); 7 //Debug.Log("GetResponseStream"); 8 using (MemoryStream memoryStream = new MemoryStream()) 9 { 10 //Debug.Log("MemoryStream()"); 11 byte[] buffer = new byte[1048576]; 12 int count = 0; 13 do 14 { 15 sw.WriteLine("ストリーム書き込み0:" + ((TimeSpan)(DateTime.Now - startTime)).TotalMilliseconds.ToString() + ","); 16 // レスポンスデータからread 17 count = st.Read(buffer, 0, buffer.Length); 18 sw.WriteLine("ストリーム書き込み1:" + ((TimeSpan)(DateTime.Now - startTime)).TotalMilliseconds.ToString() + ","); 19 memoryStream.Write(buffer, 0, count); 20 sw.WriteLine("ストリーム書き込み2:" + ((TimeSpan)(DateTime.Now - startTime)).TotalMilliseconds.ToString() + ","); 21 22 } while (count != 0); 23 24 memoryStream.Position = 0; 25 26 sw.WriteLine("ストリーム書き込み後:" + ((TimeSpan)(DateTime.Now - startTime)).TotalMilliseconds.ToString() + ","); 27 28 ExtractTarByEntry(memoryStream, false); 29 //Debug.Log("End"); 30 // 処理の完了したURL削除 31 Chronus.Lib.AssetFileSys.Manager.DownLoadManager.Instance.DeleteUrlTargetIndex(0); 32 isWorking = false; 33 } 34 } 35} 36

■開発環境
Unity5.4.0f3
MacOsX10.11(EL Capitan)

■実行環境
iPhone5S
iOS8.4

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

どこに時間がかかっているか不明なのである程度憶測になってしまいますが、
以下のような点が検討できると思います。

  1. GetResponseStream()で得たストリームにBufferedStreamを被せる
  2. MemoryStreamをnewする時、capacityに大き目の値を入れておく(理想はデータサイズと同じ値かそれより大きい値)

投稿2017/06/06 06:27

編集2017/06/06 06:51
skitoy4321

総合スコア229

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問