【发布时间】:2012-03-09 14:24:39
【问题描述】:
我看到了很多 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 答案。但是内存复制呢?
我的情况:
我使用ClosedXML workbook.SaveAs(memoryStream); 创建了MemotyStream,它在托管堆中分配了大量内存。我查看了源代码,发现有使用 8 * 1024 缓冲区大小的 CopyStream 方法。改变这个大小会以某种方式减少内存使用吗?
注意: Stream 占用将近 1Gb 的内存。
【问题讨论】:
-
在您的情况下,可能是内存流使用了大部分内存而不是复制过程?值得检查,因为 8KB 缓冲区对于数百 MB 的流来说是很小的。
-
您的 XML 文档的大小是多少(写入磁盘时)?如果它是 1GB,那么您应该期望内存流为 1GB...或者如果不是 - 好 - 到(托管)内存,您希望数据去哪里?
-
@Markus Excel 文件本身只需要 20MB。这绝对是一个坏兆头。
-
"Stream 占用将近 1GB 内存?"这是否意味着,流的大小如此之大,或者您的应用程序在保存后仅使用 1GB 额外内存?您是否在内部调试过 ClosedXML?在(内部)保存方法之前设置一个断点,并确定内存是否恰好在那里增加(或找出有问题的调用)。或者,您可能想要附加分析器。
标签: c# optimization stream buffer