【发布时间】: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