2012-02-18 70 views
0

我看到了很多CopyStream實現的例子,但是當我們複製流時我有關於緩衝區大小的問題。
樣品CopyStreams實現一:當複製流時緩衝區大小的差異

private void ReadWriteStream(Stream readStream, Stream writeStream) 
{ 
    int Length = 256; 
    Byte[] buffer = new Byte[Length]; 
    int bytesRead = readStream.Read(buffer, 0, Length); 
    // write the required bytes 
    while (bytesRead > 0) 
    { 
     writeStream.Write(buffer, 0, bytesRead); 
     bytesRead = readStream.Read(buffer, 0, Length); 
    } 
    readStream.Close(); 
    writeStream.Close(); 
} 

的問題是:

  • 什麼緩衝器長度應爲(我見過256,8 * 1024, 32768)?
  • 不同的緩衝區大小如何影響性能,內存使用情況等?

相關的問題:
File IO with Streams - Best Memory Buffer Size - 漂亮的文件IO答案。但是在內存複製方面呢?


我的情況:
MemotyStream我創建使用ClosedXMLworkbook.SaveAs(memoryStream);和它分配在託管堆中的內存量巨大。我查看了源代碼,發現有使用8 * 1024緩衝區大小的CopyStream方法。以某種方式更改此大小可以減少內存使用量?
注意:流需要幾乎1Gb的內存。

+0

就你而言,可能大部分內存是由內存流使用而不是複製過程?值得檢查,因爲對於數百MB的數據流,8KB緩衝區很小。 – 2012-02-18 12:37:50

+0

XML文檔的大小(寫入磁盤時)是多少?如果它是1GB,那麼你應該預期內存流爲1GB ......或者你認爲數據如果不是 - 那麼 - (管理的)內存呢? – thoean 2012-02-18 13:21:50

+0

@Markus Excel文件本身只需20MB。這絕對是一個不好的跡象。 – 2012-02-18 13:33:46

回答

3

如果您使用的是.NET 4,你可以做到這一點簡單:

srcStream.CopyTo(dstStream); 

但是,如果你想/需要自己實現它,我會建議較小的緩衝區(256B - 1KB)內存流和中等大小緩衝區(10KB)用於文件流。您還可以使其取決於源流的大小,例如10%,其中一些大小限制爲1MB左右。

對於文件,緩衝區越大,複製操作的速度越快(在某種程度上)但安全性較低。對於內存流而言,小緩衝區幾乎與大內存流一樣有效,但在內存上更容易(如果複製很多)。

+0

你說得對。但我需要知道緩衝區大小如何影響內存使用情況和性能。 – 2012-02-18 12:06:45

+0

然後做一些測試。如果您複製了大量內容並希望保持低內存使用率,請首先進入小緩衝區,然後測試,增加緩衝區並再次測試以查看影響。繼續這樣做,直到你的甜蜜點。 – 2012-02-18 12:33:27