读进程写的最佳缓冲区大小

时间:2013-03-21 06:18:27

标签: c++ c performance optimization memory-management

在我的函数中,我需要将文件中的一些数据读入缓冲区,操作数据并将其写回另一个文件。该文件大小未知,可能非常大。

如果我使用一个小缓冲区,将会有一个很长的读/写周期,这将花费很多时间。相反,长缓冲区意味着我需要消耗更多内存。我应该使用的最佳缓冲区大小是多少?这种情况是否依赖?

我在Windows中看到了一些类似'Tera copy'的应用程序,可以高效地管理大量文件。我应该注意其他任何技术或机制吗?

注意:此程序将在Windows下运行。

6 个答案:

答案 0 :(得分:17)

了解Microsoft对IO大小的评价:http://technet.microsoft.com/en-us/library/cc938632.aspx。基本上,他们说你应该在64K块中做IO。

在* NIX平台上,struct stat有一个st_blksize成员,该成员说明应该是最小IO块大小。

答案 1 :(得分:6)

确实是高度依赖于案例的,您应该只编写程序以便能够处理灵活的缓冲区大小,然后尝试最佳的大小。

如果从小处开始然后增加缓冲区大小,则可能会达到一定的大小,之后您将看不到或极小的性能提升,因为CPU花费大部分时间来运行代码,并且来自I / O的开销可以忽略不计。

答案 2 :(得分:1)

内存管理始终取决于案例,特别是与文件I / O结合使用时。

我方有两种可能的建议。

1)使用固定的I / O缓冲区大小,例如64K,256K,512KB或1MB。但是在这种情况下,如果I / O超过此固定缓冲区大小,则必须考虑在多次迭代中完成I / O的偏移。

2)使用malloc()使用变量I / O缓冲区大小,但这也取决于某些因素。例如系统中的可用RAM以及操作系统中进程的最大动态内存分配限制。

答案 3 :(得分:1)

这些事情的第一条规则就是基准。我的猜测是你过早地优化了。如果您正在使用真正的文件IO,那么磁盘(或其他)的带宽通常会成为瓶颈。只要您将数据写入多个页面的块中,性能就不会发生太大变化。

您可能希望与写入操作并行地计算部分数据。为此,您必须保留两个缓冲区,一个当前已写入,另一个用于处理。然后你会在POSIX系统上使用异步IO功能(aio_write,也可能在Windows上存在类似的东西)并为每次迭代切换缓冲区。

答案 4 :(得分:0)

我建议你使用页面大小的缓冲区大小。例如,页面大小为4K,那么您可以使用4K字节缓冲区大小来最小化上下文切换。

答案 5 :(得分:-1)

虽然我不能说算法...内存使用与处理器使用是编程中的经典困境,你应该根据具体情况选择...所以如果系统有4GB可用RAM你可以明显消耗相当一点,如果你只有512MB,你应该花费很少的代价来运行CPU。最好的方法是以编程方式检查和更改您的尺寸:)