如何提高文件阅读速度?

时间:2016-07-20 08:23:58

标签: c++ file-io io getline stringstream

我有大的.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;
}

1 个答案:

答案 0 :(得分:-1)

我认为这是因为默认情况下C ++不是缓冲流。所以在第一个循环中你只得到一行(因为它没有被缓冲),通过迭代你一次又一次地访问硬盘(这将非常慢)。you may want to look at this question, it might help you.