在我的Azure角色代碼中,我下載了一個400兆字節的文件,該文件被分割成10兆字節塊並存儲在Blob存儲中。我使用CloudBlob.DownloadToStream()
進行下載。爲什麼寫入MemoryStream比文件慢?
我試了兩個選項。一個是使用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千兆字節的可用內存,因此它不是由於分頁導致的。
爲什麼寫入文件的速度比寫入文件的速度要快?MemoryStream
?
你確定你的內存流不交換? – Oded 2012-08-17 13:26:29
有趣的問題,如果沒有進行MemoryStream的分頁應該快得多。您使用的實例大小是多少?你可以發佈一些代碼(即使這可能無關緊要,因爲你只是簡單地調用Storage Client庫)。 – 2012-08-17 13:28:59
你有1 GB *物理*內存或1 GB *虛擬*內存嗎? – Servy 2012-08-17 13:29:03