【问题标题】:Determining buffer size when working with files in C#? [duplicate]在 C# 中处理文件时确定缓冲区大小? [复制]
【发布时间】: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 等)对其进行基准测试,看看哪个是最快的。

标签: c# .net c#-4.0 io


【解决方案1】:

4KB 是一个不错的选择。欲了解更多信息,请查看:
File I/O with streams - best memory buffer size

问候

【讨论】:

  • 我注意到在使用异步 FileStreams (new FileStream( ..., useAsync: true );) 时,您需要更大的缓冲区 - StackOverflow 上的其他帖子建议使用 80KiB 到 128KiB 以获得最佳性能)。还要确保任何关联的StreamReader/StreamWriter/BinaryReader/BinaryWriter 中的缓冲区大小也适当。异步 IO 的性能比具有小缓冲区的同步 IO 更差,但比具有大缓冲区的同步 IO 性能要好得多,这补偿了异步管道的开销(尤其是在异步 IO 释放这些线程的重负载下!)。
猜你喜欢
  • 2018-06-24
  • 2021-06-06
  • 1970-01-01
  • 1970-01-01
  • 2021-12-10
  • 1970-01-01
  • 2020-09-05
  • 1970-01-01
相关资源
最近更新 更多