我正在写一个需要阅读相当大的文件的应用程序。 我一直想知道现代Windows XP计算机上读取缓冲区的最佳大小。 我search了一下,发现了很多例子,其中最佳尺寸为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); }
我的应用程序相当简单,所以我不想写任何基准代码,但想知道什么尺寸是常见的?
一个1K的缓冲区大小似乎有点小。 一般来说,没有“一刀切”的缓冲区大小。 您需要设置适合您算法行为的缓冲区大小。 现在,一般来说,拥有一个真正巨大的缓冲区并不是一个好主意,但是,如果有一个太小或者不符合你处理每个块的方式,那么这个缓冲区也不是那么好。
如果你只是在处理数据之前把数据一块接一块地全部读入内存,我会使用一个更大的缓冲区。 我可能会使用8K或16K,但可能不会更大。
另一方面,如果您正在以流方式处理数据,那么读取一个块然后在读取下一个较小的缓冲区之前处理它可能会更有用。 更妙的是,如果您正在流式传输具有结构的数据,那么我会更改读取的数据量,使其与您正在阅读的数据类型特别匹配。 例如,如果您正在读取包含4个字符的代码,一个浮点数和一个字符串的二进制数据,则会将四个字符的代码读入一个4字节的数组以及浮点数。 我会读取字符串的长度,然后创建一个缓冲区来一次读取整个字符串数据块。
如果你正在做流数据处理,我会查看BinaryReader和BinaryWriter类。 这些允许你很容易地处理二进制数据,而不必担心数据本身。 它还允许您将缓冲区大小与正在使用的实际数据分离。 您可以在基础流上设置一个16k缓冲区,并轻松地使用BinaryReader读取各个数据值。
取决于您在访问时间和内存使用情况之间的界限。 缓冲区越大,速度越快 – 但内存方面的成本更高。 读取文件系统簇大小的倍数可能是最有效的,在使用NTFS的Windows XP系统中,4K是默认簇大小。
你可以看到这个链接NTFS,FAT和exFAT的默认簇大小
再见。