我有大的.txt文件,每行有超过一百万行和七列浮点数。列通过空格分隔。
目前,我通过读取每一行(getline)导入文件,将行转换为流,然后将七个值存储到数组变量中(请参阅我的最小示例)。但是,这个程序非常慢,300万行(500MB)大约需要10分钟。这相当于0.8 MB / s,并且比写入文件要慢得多。我的硬盘是SSD。
您能否就如何提高代码效率向我提出建议?
Bests,Fabian
C ++
#include <iostream>
#include <string>
#include <sstream>
#include <fstream>
struct Container { double a, b, c, d, e, f, g; };
void read_my_file(std::ifstream &file, Container *&data) {
std::string line;
std::stringstream line_as_stream;
unsigned int column;
unsigned long int row;
data = new Container[300000]; //dynamically allocated because the
//length is usually a user input.
for (row = 0; row < 300000; row++) {
getline(file, line);
line_as_stream.str(line);
for (column = 0; column < 7; column++) {
line_as_stream >> data[row].a;
line_as_stream >> data[row].b;
line_as_stream >> data[row].c;
line_as_stream >> data[row].d;
line_as_stream >> data[row].e;
line_as_stream >> data[row].f;
line_as_stream >> data[row].g;
}
line_as_stream.clear();
}
}
int main(void) {
Container *data = nullptr;
std::ifstream file;
file.open("./myfile.txt", std::ios::in);
read_my_file(file, data);
std::cout << data[2].b << "\n";
file.close();
return 0;
}
答案 0 :(得分:-1)
我认为这是因为默认情况下C ++不是缓冲流。所以在第一个循环中你只得到一行(因为它没有被缓冲),通过迭代你一次又一次地访问硬盘(这将非常慢)。you may want to look at this question, it might help you.