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