在我的 Azure 角色代码中,我下载了一个 400 兆字节的文件,该文件被分成 10 兆字节的块并存储在 Blob 存储中。我CloudBlob.DownloadToStream()
用于下载。
我尝试了两种选择。一个是使用FileStream
- 我创建一个“写入”FileStream
并将块一个接一个地下载到同一个流中而不倒带,所以我最终得到一个原始文件。另一种选择是MemoryStream
通过传递一个比原始文件大小稍大的数字作为流大小(以避免重新分配)并将块下载到该对象中来创建一个对象MemoryStream
——这样我最终得到了一个MemoryStream
保存原始文件数据的对象。
这是一些伪代码:
var writeStream = new StreamOfChoice( params );
foreach( uri in urisToDownload ) {
blobContainer.GetBlobReference( uri ).DownloadToStream( writeStream );
}
现在唯一的区别是它FileStream
在一种情况下是a MemoryStream
,在另一种情况下是a,其余的都是一样的。事实证明,a 大约需要 20 秒,aFileStream
大约需要 30 秒MemoryStream
- 是的,FileStream
结果更快。根据\Memory\Available Bytes
性能计数器,虚拟机在创建之前有大约 1 GB 的可用内存MemoryStream
,所以这不是由于分页。
为什么写入文件比写入文件要快MemoryStream
?