我看到很多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();
}
问题是:
相关问题:
File IO with Streams - Best Memory Buffer Size - 很好的文件IO答案。但是在内存复制方面呢?
我的情况:
我使用ClosedXML MemotyStream
创建了workbook.SaveAs(memoryStream);
,并在托管堆中分配了大量内存。我查看了源代码,发现有一个使用8 * 1024缓冲区大小的CopyStream方法。可以改变这个大小以某种方式减少内存使用?
注意: Stream需要几乎1Gb的内存。
答案 0 :(得分:5)
如果您使用的是.NET 4,则可以更简单:
srcStream.CopyTo(dstStream);
但是如果你想/需要自己实现它,我建议使用较小的缓冲区(256B - 1KB)用于内存流,而中等大小的缓冲区(10KB)用于文件流。您还可以使其依赖于源流的大小,例如10%,大小限制为1MB左右。
对于文件,缓冲区越大,复制操作越快(在某种程度上),但安全性会降低。对于内存流,小缓冲区几乎与大缓冲区一样有效但内存更容易(如果你复制很多)。