15

在我的 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

4

2 回答 2

3

乔恩可能在那里。最可能解释是,

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

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

于 2012-08-17T13:47:18.143 回答
1

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

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

于 2013-09-04T11:39:43.263 回答