我已经为 Windows 7 - 64bit 编写了一个 C/C++ 程序,它适用于非常大的文件。在最后一步中,它从输入文件 (10GB+) 中读取行并将它们写入输出文件。对输入文件的访问是随机的,写入是顺序的。编辑:这种方法的主要原因是减少 RAM 的使用。
我在阅读部分基本上是这样的:(对不起,很短,可能有问题)
void seekAndGetLine(char* line, size_t lineSize, off64_t pos, FILE* filePointer){
fseeko64(filePointer, pos, ios_base::beg);
fgets(line, lineSize, filePointer);
}
通常这段代码很好,不是说很快,但在一些非常特殊的情况下它会变得很慢。该行为似乎不是确定性的,因为性能下降发生在文件其他部分的不同机器上,甚至根本没有发生。甚至到目前为止,程序完全停止读取,而没有磁盘操作。
另一个症状似乎是使用过的 RAM。我的进程保持它的 RAM 稳定,但系统使用的 RAM 有时会变得非常大。在使用了一些 RAM 工具后,我发现 Windows 映射文件会增长到几 GB。这种行为似乎也取决于硬件,因为它发生在进程不同部分的不同机器上。
据我所知,SSD上不存在这个问题,所以它肯定与HDD的响应时间有关。
我的猜测是 Windows 缓存变得“奇怪”。只要缓存起作用,程序就会很快。但是当缓存出错时,行为要么进入“停止读取”,要么进入“增加缓存大小”,有时甚至两者兼而有之。由于我不是 Windows 缓存算法的专家,我很乐意听到解释。此外,有什么方法可以让 Windows 脱离 C/C++ 来操作/停止/强制缓存。
由于我现在正在寻找这个问题一段时间,我已经尝试了一些技巧,但没有成功:
- 文件指针 = fopen(文件名,“rbR”);//只是填充缓存直到RAM已满
- 读/写的大量缓冲,以阻止两者相互进入
提前致谢