用C++处理简单但大型文件的有效方法

swa*_*jak 8 c++

我正在开展一个项目,让我在性能方面略胜一筹.我的任务是读取大(50MB左右)的粒子坐标文件并显示它们.我想使用C++,因为我已经在学习它了.

文件中的坐标结构很简单,只有很多(比如一百万左右):

1234.5667 5234.1566 //coordinate 1  
8532.6123 5152.6612 //coordinate 2  
....
Run Code Online (Sandbox Code Playgroud)

作为一个菜鸟,我只想逐行阅读文件并将它们存储在向量中,这是错的吗?也许我应该首先读取整个文件(缓冲?),然后解析值?

工作范例:

clock_t c1 = clock();
vector<double> coords;
double coord;
ifstream fin("file.txt");
while(fin >> coord) {
    coords.push_back(coord);
}
cout << "done. " << coords.size()/2 << " coords read.\n";
cout << "took " << (clock() - c1)/(double)CLOCKS_PER_SEC << " seconds." << endl;
Run Code Online (Sandbox Code Playgroud)

并在具有200万坐标的40MB文件上输出相应的输出:

done. 2000000 coords read.
took 1.74 seconds.
Run Code Online (Sandbox Code Playgroud)

这在我看来很快,但我认为我的思想不是一个好的判断.

Joe*_*Joe 3

如果您知道“平均”文件有多大,您可能需要使用 .reserve 预分配向量。

效率是一个棘手的游戏。不要一开始就耍花招,设计一个好的基础算法。如果不够快,您就开始查看 IO 例程,无论您是否正在创建任何“额外”对象(显式或隐式,尤其是在传递参数时)。

在您的示例中,您可能希望在打印摘要输出之前对clock()进行第二次调用——获得稍微更准确的计时!:)

  • 紧接在 while 循环之后。将其分配给另一个clock_t变量并在cout语句中进行减法。由于您当前正在第二个 cout 语句中调用clock(),因此报告的执行时间包括第一个 cout 语句。与循环中花费的时间相比,它可能并不重要,但作为一般规则,I/O(cin、cout 等)可能相对昂贵,并且您不希望将其包含在计时中。 (2认同)