在我的函数中,我需要从文件中读取一些数据到缓冲区中,对数据进行处理并将其写回另一个文件。该文件的大小未知,可能非常大。
如果我使用小缓冲区,读/写循环会很长,花费很多时间。相反,长缓冲区意味着我需要消耗更多的内存。我应该使用什么样的最佳缓冲区大小?这种情况是否依赖于特定情况?
我看到 Windows 上的 'Tera copy' 等应用程序可以高效地管理大型文件。是否还有其他技术或机制我应该了解?
注意:此程序将在 Windows 下运行。
在我的函数中,我需要从文件中读取一些数据到缓冲区中,对数据进行处理并将其写回另一个文件。该文件的大小未知,可能非常大。
如果我使用小缓冲区,读/写循环会很长,花费很多时间。相反,长缓冲区意味着我需要消耗更多的内存。我应该使用什么样的最佳缓冲区大小?这种情况是否依赖于特定情况?
我看到 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)使用可变的I/O缓冲区大小,使用malloc()函数,但这也取决于某些因素,例如系统中可用的RAM和进程的最大动态内存分配限制。
虽然我不能代表算法发言...内存使用与处理器使用是编程中的经典困境,你应该根据具体情况进行选择...所以如果系统有4GB可用RAM,你显然可以消耗相当多的内存,而如果只有512MB,你应该尽量少消耗内存,以换取CPU的使用。最好的方法是通过编程方式检查和更改你的大小 :)
mmap
可以帮助解决问题。而且 Linux 也有一个readahead
系统调用。 - Basile Starynkevitch