我在阅读大型二进制文件(2 GigaBytes)时遇到了fstream问题。使用此测试代码我创建fstream,然后读取直到EOF。然后清除标志并将位置重置到文件的开头。然后我再读一遍。问题是,第二次读取(第二次循环)总是明显变慢。
我需要为Embarcadero RAD Studio XE7解决这个问题。可以在MS Visual 2010中复制较慢的第二次读取的相同beheaviour。首先读取以HDD最大速度(大约140 MB / s)完成,第二次读取始终以四分之一(35 MB / s)完成。
奇怪的是,当我在Debian上使用g ++ 4.9.2时,第一次和第二次读数都是在我预期的同时完成的。
#include <stdio.h>
#include <cstdlib>
#include <fstream>
#include <string>
char buffer[400000];
int main()
{
std::fstream stream;
std::string filename = "largeFile.bin";
stream.open(filename, std::ios_base::in | std::ios_base::binary);
while(stream.good()){
stream.read(buffer, 400000);
}
printf("first read complete");
stream.clear();
stream.seekg(std::ios::beg);
while(stream.good()){
stream.read(buffer, 400000);
}
printf("second read complete");
stream.close();
return 0;
}
我省略了两个周期的时间测量,因为它对于这个问题并不重要。
一旦打开文件,从开始到EOF多次阅读时我做错了什么?