在C#中处理文件时如何确定缓冲区大小?

9

我有一个简单的代码,可以将文本文件合并成一个文本文件:

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 - 是否有任何公式可以构建以找到空闲缓冲区大小?

现在已经“虚拟化”了“硬盘块大小”,因此不可能有这样的公式……此外,不同的操作系统版本/版本之间存在差异(有时差异很大)。如果您想获得最佳性能,应该查看MMF(内存映射文件),它已经在Windows上可用很长时间,现在甚至成为.NET(V 4.0及以上版本)的一部分。 - Yahia
通过缓冲区大小调整,您想要实现什么目标? - Sergey Vyacheslavovich Brunov
1
还有操作系统的IO缓冲,所以你可以每次处理1个字节,仍然能获得可行的性能(不要这样做)。你最好的选择是使用一些不同的数字(512,1k,2k,4k等)进行基准测试,并查看哪一个最快。 - Ibasa
1个回答

8

在使用异步 FileStreams(new FileStream( ..., useAsync: true );)时,您需要一个较大的缓冲区-StackOverflow 上的其他帖子建议使用 80KiB 到 128KiB 以获得最佳性能。还要确保任何相关的 StreamReader /StreamWriter /BinaryReader /BinaryWriter 中的缓冲区大小也适当。使用小缓冲区的异步 IO 性能不如同步 IO,但使用大缓冲区(可以弥补异步管道的开销,特别是在高负载下,异步 IO 可以释放这些线程!)表现比同步 IO 要好得多。 - Dai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接