我正在编写一个需要读取相当大的文件的应用程序。我一直想知道在现代Windows XP计算机上读取缓冲区的最佳大小是多少。我用Google搜索并发现许多例子,其中1024是最佳尺寸。
以下是我的意思摘要:
long pointer = 0;
buffer = new byte[1024]; // What's a good size here ?
while (pointer < input.Length)
{
pointer += input.Read(buffer, 0, buffer.Length);
}
我的应用程序非常简单,所以我不打算编写任何基准测试代码,但是想知道常见的大小是什么?
答案 0 :(得分:9)
1k缓冲区大小似乎有点小。通常,没有“一刀切”的缓冲区大小。您需要设置适合算法行为的缓冲区大小。现在,一般来说,拥有一个非常大的缓冲区并不是一个好主意,但是,如果一个太小或不符合你处理每个块的方式也不是那么好。
如果您只是在处理数据之前将一个接一个的数据完全读入内存,我将使用更大的缓冲区。我可能会使用8k或16k,但可能不会更大。
另一方面,如果您正在以流方式处理数据,那么在读取下一个较小的缓冲区之前读取一个块然后处理它可能会更有用。更好的是,如果您正在传输具有结构的数据,我会将读取的数据量更改为与您正在读取的数据类型特别匹配。例如,如果您正在读取包含4个字符的代码,浮点数和字符串的二进制数据,我会将4个字符的代码读取为4个字节的数组,以及浮点数。我会读取字符串的长度,然后创建一个缓冲区来一次读取整个字符串数据块。
如果您正在进行流数据处理,我会研究BinaryReader和BinaryWriter类。这些允许您非常轻松地处理二进制数据,而无需担心数据本身。它还允许您将缓冲区大小与正在使用的实际数据分离。您可以在基础流上设置16k缓冲区,并使用BinaryReader轻松读取单个数据值。
答案 1 :(得分:3)
取决于您在访问时间和内存使用之间划分界限的位置。缓冲区越大,速度越快 - 但内存方面的成本也越高。文件系统群集大小的读数可能是效率最高的,在使用NTFS的Windows XP系统中,4K是默认的群集大小。
您可以看到此链接Default cluster size for NTFS, FAT, and exFAT
再见。