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ですか?