【发布时间】:2015-08-15 06:44:10
【问题描述】:
我有 10 个大型(3400 万个单元格)二维网格向量存储双精度数。写入时,它们的大小超过 200 mb。我使用 ofstream 对象将它们写入文本文件(csv 格式),一次一个元素,使用两个 for 循环(一个用于我的行,一个用于我的列)。他们需要很长时间才能写作。有没有更快的方法来写这些向量?
这是我的代码:
// Resizing of vectors
flowDirGrid.resize(rows, std::vector<double>(cols, NODATA));
// Do some processing
....
// Outputting processed data
ofstream outfile3("FlowDir.dat");
if(!outfile3.good())
return;
for(int i=0; i<rows; i++)
{
for (int j=0; j<cols; j++)
{
if(elevation[i][j]!=NODATA)
outfile3 << flowDirGrid[i][j]<<" ";
else
outfile3 << NODATA<<" ";
}
outfile3 << std::endl;
}
outfile3.close();
我正在使用 C++ 和 Visual Studio 2012。
编辑:。我已经删除了所有的 std::endl 实例并替换为 "\n",但仍然需要 17 分钟来编写每个输出文件。我可能会转而使用推荐的 C 方法。
使用三元而不是 if-else 阶梯会加快速度吗?
【问题讨论】:
-
如果
fstream太慢,你可以测试是否使用较低级别的std::snprintf到字符缓冲区,然后使用std::fwrite将缓冲区内容写入速度加快。或者,如果您可以使用额外的库,您可以查看 The Boost Format library 并查看它们是否表现更好。 -
太长是 10-20 分钟,具体取决于机器。有时,作为其中一部分的代码需要连续运行 10-100 次以校准处理功能。所以我在 1 次跑步中节省的每一分钟,在某些跑步中可以节省 10 到 100 分钟。
-
当输出看起来很慢时要做的第一件事就是只在最后刷新缓冲区,而不是在循环中。
std::endl基本上是输出缓冲区的返回和刷新。 -
如果您不需要使用不同大小的行的能力,请考虑使用连续数据结构