我有一个学校项目,我有一个带有~2M行(~42MB)的* .txt文件,每行包含行号,列号和值。我正在将它们解析为三个向量(int,int,float),但它需要大约45秒才能完成。我正在寻找一些方法来加快速度。我想瓶颈是每个元素的迭代,最好加载一行/列/值并一次将它们放入一个向量中。不幸的是,我不知道该怎么做,或者它是否可能。另外我想坚持STL。 有没有办法让它更快?
谢谢!
文件示例(第一行包含行数,列数和非零值):
1092689 2331 2049148
1 654 0.272145
1 705 0.019104
2 245 0.812118
2 659 0.598012
2 1043 0.852509
2 1147 0.213949
目前我正在使用:
void LoadFile(const char *NameOfFile, vector<int> &row,
vector<int> &col, vector<float> &value) {
unsigned int columns, rows, countOfValues;
int rN, cN;
float val;
ifstream testData(NameOfFile);
testData >> rows >> columns >> countOfValues;
row.reserve(countOfValues);
col.reserve(countOfValues);
value.reserve(countOfValues);
while (testData >> rN >> cN >> val) {
row.push_back(rN);
col.push_back(cN);
value.push_back(val);
}
testData.close();
}
答案 0 :(得分:0)
在寻找问题的解决方案之前,我建议采取一些步骤来弄清楚瓶颈是从文件中读取数据还是填充向量。为此,我将进行以下操作:
如果瓶颈是(1),找到加快从文件中读取数据的方法 如果瓶颈是(2),找到加快向量填充的方法。
使用$3
读取正在调用的文件的全部内容,然后使用std::istream::read
提取数据应该会带来一些改进。
<击> 撞击>
<击>在向std::istringstream
添加数据之前,请预留大容量,这会减少调整大小的次数。
如果您知道有1M行文本,请在向量中保留1M元素。如果向量中的实际项目数量少一点或多一点,那么从性能角度来看,它应该不会太重要。
击>
PS OP已经在这样做了。