我有一个大约 400MB 的 1000 行文件,表示一些表示为字符串的数字数据。我想转置数据,以便每行只有 1000 个字符串(这样我就可以打开它并用 pandas 快速绘制它)。
我将整个文件导入到我想要转置的字符串向量的向量中(最终我想写回文件)。
我使用两个嵌套循环来遍历 2d 结构,并将其写入一些 std::ofstream。它很长。然后我尝试专注于转置,并编写了以下代码:
//Read 400MB file, 90K strings per line and 1K lines, and store it into
std::vector<std::vector<std::string>> mData;
// ...
// IO the file and populate mData with raw data
// ...
//All rows have same number of string
size_t nbRows = mData.size();
size_t nbCols = mData[0].size();
std::vector<std::vector<std::string> > transposedData(nbCols);
for(size_t i = 0 ; i < nbCols ; ++i)
{
transposedData[i].resize(nbRows);
for(size_t j = 0 ; j < nbRows ; ++j)
{
transposedData[i][j] = doc.mData[j][i];
}
}
我认为几秒钟就足够了,但它需要几分钟。另外,我正在尝试使用不同的输入尺寸(对于相同的 400MB 文件大小,每行只有 3 行和更多的字符串),而且速度要快得多。
编辑 1
根据人们的建议,我使用 callgrind 进行了分析。我在此过程中收到此消息:...线程#1 中的 brk 段溢出:无法增长到...
我对结果进行了分析并在此总结:
25 % 用于 basic_string 的 operator=
21 % 用于构建 basic_string (只有 3% 的时间在 new 中)
14 % 用于外部向量的 operator()[]
11 % 用于内部向量的 operator()[]
谢谢你的建议。