2012-02-18 69 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