Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C#中处理文件时确定缓冲区大小?_C#_.net_C# 4.0_Io - Fatal编程技术网

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

在C#中处理文件时确定缓冲区大小?,c#,.net,c#-4.0,io,C#,.net,C# 4.0,Io,我有一个简单的代码,它将文本文件组合成一个文本文件: 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) {

我有一个简单的代码,它将文本文件组合成一个文本文件:

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
size的

我怎么知道我选择的号码是否正确?(1024*2)

我正试图找到空闲公式:


假设每个文件的大小都是
F mb
,我有
R mb
的Ram,我的硬盘的块大小是
B kb
——有没有什么公式可以用来计算空闲缓冲区的大小

4KB是一个不错的选择。有关更多信息,请查看以下内容:


问候语

不可能有任何这样的公式,因为现在连“高清块大小”都是“虚拟化”的。。。最重要的是,操作系统版本/版本之间存在差异(有时差异很大)。如果你想获得最大的性能,你应该签出MMF(内存映射文件),它在Windows中已经使用了很长时间,现在甚至是.NET(V4.0及更高版本)的一部分。你试图通过调整缓冲区大小来实现什么?操作系统也对IO进行缓冲,因此你可以一次执行1个字节的操作,并且仍然可以获得可用的性能(不要这样做)。最好的办法是使用一些不同的数字(512、1k、2k、4k等)对其进行基准测试,看看哪一个最快。我注意到,在使用异步文件流时(
newfilestream(…,useAncync:true);
),您需要一个更大的缓冲区-StackOverflow上的其他帖子建议使用80KiB到128KiB以获得最佳性能)。还要确保任何关联的
StreamReader
/
StreamWriter
/
BinaryReader
/
BinaryWriter
中的缓冲区大小也适当。异步IO的性能比使用小缓冲区的同步IO差,但比使用大缓冲区的同步IO好得多,大缓冲区补偿了异步管道的开销(特别是在异步IO释放线程的重载情况下!)。