【发布时间】:2013-08-14 23:16:24
【问题描述】:
我有一个简单的代码,它将文本文件合并到一个文本文件中:
void Main()
{
const int chunkSize = 2 * 1024; // 2KB
var inputFiles = new[] { @"c:\1.txt", @"c:\2.txt", @"c:\3.txt" };
using (var output = File.Create(@"c:\output.dat"))
{
foreach (var file in inputFiles)
{
using (var input = File.OpenRead(file))
{
var buffer = new byte[chunkSize];
int bytesRead;
while ((bytesRead = input.Read(buffer, 0, buffer.Length)) > 0)
{
output.Write(buffer, 0, bytesRead);
}
}
}
}
}
我的问题是关于chunkSize 的大小。
我如何知道我选择的号码是否正确? (1024*2)
我正在寻找空闲公式:
假设每个文件大小是 F mb ,我有 R mb 的 Ram 并且我的硬盘的块大小是 B kb - 有没有什么公式可以建立来找到空闲缓冲区大小?
【问题讨论】:
-
不可能有任何这样的公式,因为这些天甚至“HD的块大小”都被“虚拟化”了......最重要的是操作系统版本之间存在差异(有时很大)/版本。如果您想要获得最佳性能,您应该查看 MMF(内存映射文件),它已在 Windows 中提供了很长时间,现在甚至是 .NET(V 4.0 及更高版本)的一部分。
-
你想通过调整缓冲区大小来达到什么目的?
-
操作系统还对 IO 进行缓冲,因此您可以一次执行 1 个字节,但仍然可以获得可行的性能(不要这样做)。最好的办法是用一些不同的数字(512、1k、2k、4k 等)对其进行基准测试,看看哪个是最快的。