【问题标题】:Why is writing to a MemoryStream slower than to a file?为什么写入 MemoryStream 比写入文件慢?
【发布时间】:2012-08-17 13:20:42
【问题描述】:

在我的 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 更快。根据\Memory\Available Bytes 性能计数器,在创建MemoryStream 之前,虚拟机有大约1 GB 的可用内存,所以这不是由于分页。

为什么写入文件比写入MemoryStream 更快?

【问题讨论】:

  • 你确定你的内存流没有交换吗?
  • 您有 1 GB 的物理内存还是 1 GB 的虚拟内存?
  • @Servy 即使它是虚拟机所说的“物理”,我们如何知道虚拟机正在运行的真实机器中发生了什么?
  • @sharptooth,在解决此性能问题时,您还应该查看报告分页活动的性能计数器:technet.microsoft.com/en-us/library/cc958290.aspx(只是为了 100% 确定分页)
  • 我会在循环中尝试可用内存和分页计数器。也许尝试在本地机器上。在本地机器上,您可以配置无页面文件。不确定这是否有助于解决您在 Azure 上的问题。但可能会验证症状是否与交换一致。

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


【解决方案1】:

Jon 很可能在那里控球。 最可能的解释是,

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

不管内存是否更快,你真的不应该分配这么大的内存块。在这里阅读LOH vs SOH

【讨论】:

  • 好吧,如果涉及的磁盘速度相同(或相同的磁盘),我们仍然希望文件写入优于页面文件写入,因为文件写入将是顺序的,即这种情况下,任何基于旋转盘的磁盘(无论是简单的还是 RAID,但不包括 SSD)在顺序情况下都更好。分页在大多数情况下往往不会造成太大的伤害,因为它在完成时会进入智能状态,因此分页内存在大多数情况下胜过文件访问,但不是这种情况。
  • 我不同意。我指的分页是管理程序分页而不是操作系统分页。它们不是一回事。管理程序交换的成本要高得多,因为它不知道哪些页面最适合被调出。其次,Hypervisor 分页经常在大规模部署中放置在服务器的本地磁盘上,而不是放在速度更快的共享存储上。
  • 这两个都不同意另一个。 1:SANS存储>HV分页。 2:基于磁盘的顺序 > 基于磁盘的随机。它们都可以完全正确。
  • 我不同意后者的更多:) 磁盘上的顺序 > 磁盘上的随机数,除了在虚拟化中是正确的。这里有很多可能性。像 NetApp 这样的系统上的随机写入将出现顺序,因为它是一个 COW 文件系统。说 HDS 阵列上的随机写入将等于顺序写入,因为控制器中的大型缓存在写入磁盘之前将写入提交到电池支持的缓存中。一旦涉及到虚拟化使用的高端存储系统,许多“标准”陈述就不再适用了。
  • 确实如此。还有一个原因,我不明白这是我在相当长的一段时间内投票率最高的答案,而你已经得到了我给你的单一 +1。应该完全相反。
【解决方案2】:

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

首先我对此感到困惑并最终来到了这里。现在我对 MemoryStream 很好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-29
    • 2020-05-15
    • 2018-09-23
    • 1970-01-01
    相关资源
    最近更新 更多