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

时间:2012-08-17 13:20:42

标签: c# .net file-io azure memorystream

在我的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而在另一个案例中是MemoryStream,其余的都是相同的。事实证明,使用FileStream需要大约20秒,使用MemoryStream大约需要30秒 - 是的,FileStream变得更快。根据{{​​1}}性能计数器,虚拟机在创建\Memory\Available Bytes之前有大约1 GB的可用内存,因此不是由于分页。

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

2 个答案:

答案 0 :(得分:3)

乔恩可能在那里接球。 大多数可能的解释是,

  1. 实际上,虚拟机管理程序将内存分页到磁盘。
  2. 虚拟机管理程序交换文件位于速度较低的磁盘(例如本地磁盘)上。
  3. VM的FileSystem位于快速企业磁盘(例如SAN)上。
  4. 无论内存是否更快,你都不应该分配出如此大的内存块。在这里阅读LOH vs SOH

答案 1 :(得分:1)

在调试模式(VS)中使用MemoryStream时,速度非常慢,即使数据量很小。在没有附加调试器的情况下运行它与FileStream相当甚至更快。

首先我对此感到困惑并最终到此为止。现在我对MemoryStream很好。