15

Azureのロールコードで、400メガバイトのファイルをダウンロードします。このファイルは10メガバイトのチャンクに分割され、BlobStorageに保存されます。ダウンロードに使用CloudBlob.DownloadToStream()します。

私は2つのオプションを試しました。1つは使用していFileStreamます-「書き込み」を作成し、FileStream巻き戻さずにチャンクを1つずつ同じストリームにダウンロードするため、元のファイルになります。もう1つのオプションはMemoryStream、元のファイルサイズよりわずかに大きい数値をストリームサイズとして渡して(再割り当てを回避するため)、その中にチャンクをダウンロードすることでオブジェクトを作成することです。MemoryStreamこれによりMemoryStream、元のファイルデータを保持することになります。

ここにいくつかの擬似コードがあります:

var writeStream = new StreamOfChoice( params );
foreach( uri in urisToDownload ) {
    blobContainer.GetBlobReference( uri ).DownloadToStream( writeStream );
}

唯一の違いはFileStream、一方のケースともう一方のケースでMemoryStream、残りはすべて同じであるということです。aの場合は約20秒FileStream、-の場合は約30秒かかることがわかります。MemoryStreamそうです、FileStreamより高速であることがわかります。パフォーマンスカウンターによると\Memory\Available Bytes、仮想マシンには、作成前の時点で約1ギガバイトのメモリが使用可能であるMemoryStreamため、ページングが原因ではありません。

ファイルへの書き込みがファイルへの書き込みよりも速いのはなぜMemoryStreamですか?

4

2 に答える 2

3

ジョンはおそらくそこでボールに乗っています。最も可能性高い説明は、

  1. メモリは実際にはハイパーバイザーによってディスクにページアウトされます。
  2. ハイパーバイザー スワップ ファイルは低速ディスク (ローカル ディスクなど) にあります。
  3. VM のファイル システムは、高速なエンタープライズ ディスク (SAN など) 上にあります。

メモリが速いかどうかに関係なく、そのような大きなメモリ ブロックを割り当てるべきではありません。ここでLOH と SOHについて読ん でください。

于 2012-08-17T13:47:18.143 に答える
1

デバッグ モード (VS) で MemoryStream を使用すると、少量のデータであっても速度が非常に遅くなります。デバッガーを接続せずに実行すると、FileStream に匹敵するか、さらに高速になります。

最初はこれに戸惑い、ここにたどり着きました。今、私はMemoryStreamで元気です。

于 2013-09-04T11:39:43.263 に答える