读进程写的最佳缓冲区大小
在我的函数中,我需要将文件中的一些数据读入缓冲区,操作数据并将其写回另一个文件。 该文件大小未知,可能非常大。
如果我使用一个小缓冲区,将会有一个很长的读/写周期,这将花费很多时间。 相反,长缓冲区意味着我需要消耗更多内存。 我应该使用的最佳缓冲区大小是多少? 这种情况是依赖的吗?
我在Windows中看到了一些像Tera copy这样的应用程序,可以高效地管理大量文件。 我应该注意其他任何技术或机制吗?
注意:此程序将在Windows下运行。
了解微软对IO大小的看法: http : //technet.microsoft.com/en-us/library/cc938632.aspx 。 基本上,他们说你应该在64K块中做IO。
在* NIX平台上, struct stat
有一个st_blksize
成员,它表示应该是最小IO块大小。
它确实是高度依赖于案例的,你应该只编写你的程序以便能够处理灵活的缓冲区大小,然后尝试最佳的大小。
如果你从小处开始然后增加缓冲区大小,你可能会达到一定的大小,之后你将看不到或极小的性能提升,因为CPU大部分时间都在运行你的代码,以及来自I的开销。 / O已经变得可以忽略不计了。
内存管理始终取决于案例,特别是与文件I / O结合使用时。
我方有两种可能的建议。
1)使用固定的I / O缓冲区大小,例如64K,256K,512KB或1MB。 但是在这种情况下,当I / O超过此固定缓冲区大小时,您必须考虑在多次迭代中完成I / O的偏移。
2)使用malloc()使用变量I / O缓冲区大小,但这也取决于某些因素。 例如系统中的可用RAM以及操作系统中进程的最大动态内存分配限制。
这些事情的第一条规则就是基准。 我的猜测是你过早地优化了。 如果您正在使用真正的文件IO,则磁盘(或其他)的带宽通常会成为瓶颈。 只要您将数据写入多个页面的块中,性能就不会发生太大变化。
你可能希望的是与你的写操作并行地计算部分数据。 为此,您必须保留两个缓冲区,一个当前已写入,另一个用于处理。 然后你将使用异步IO函数(POSIX系统上的aio_write
,也可能是类似于Windows的东西)和每次迭代的切换缓冲区。
我建议你使用页面大小的缓冲区大小。 例如,页面大小为4K,那么您可以使用4K字节缓冲区大小来最小化上下文切换。
虽然我不能说算法…内存使用与处理器使用是编程中的经典困境,你应该根据具体情况选择…所以如果系统有4GB可用内存,你显然会消耗很多而如果你只有512MB,你应该花费很少的代价来运行CPU。 最好的方法是以编程方式检查和更改您的尺寸:)