在我的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
?
答案 0 :(得分:3)
无论内存是否更快,你都不应该分配出如此大的内存块。在这里阅读LOH vs SOH。
答案 1 :(得分:1)
在调试模式(VS)中使用MemoryStream时,速度非常慢,即使数据量很小。在没有附加调试器的情况下运行它与FileStream相当甚至更快。
首先我对此感到困惑并最终到此为止。现在我对MemoryStream很好。