为什么写入MemoryStream比写文件慢?

sha*_*oth 15 .net c# file-io memorystream azure

在我的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 );
}
Run Code Online (Sandbox Code Playgroud)

现在唯一的区别是,它是FileStream一个案例而另一个案例,MemoryStream其余部分是相同的.事实证明,它需要大约20秒,FileStream大约需要30秒MemoryStream- 是的,FileStream结果更快.根据\Memory\Available Bytes性能计数器,虚拟机在MemoryStream创建之前具有大约1千兆字节的可用内存,因此不是由于分页.

为什么写入文件的速度要快于MemoryStream

M A*_*ifi 3

乔恩可能是其中的佼佼者。最可能解释是,

  1. 内存实际上由虚拟机管理程序调出到磁盘。
  2. 虚拟机管理程序交换文件位于速度较低的磁盘(例如本地磁盘)上。
  3. VM 的文件系统位于快速企业磁盘(例如 SAN)上。

不管内存是否更快,你都不应该分配这么大的内存块。请在此处阅读有关LOH 与 SOH 的信息 。