2016-07-20 31 views
2

我有超过一百万行和每行7浮点数的colums大.txt文件。列通过空格分开。如何提高文件的阅读速度?

目前,我通过读取每行(getline),将行转换为流,然后将这七个值存储到数组变量中(请参阅我的最小示例)来导入文件。但是,这个过程非常缓慢,300万条线路(500MB)大约需要10分钟。这对应于0.8 MB/s,并且比写入文件要慢得多。我的硬盘是SSD。

你能告诉我如何提高代码效率吗?

最好成绩,费边

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; 
} 
+2

This answer [Efficiently reading a large large text file in C++](http://stackoverflow.com/questions/26736742/efficiently-reading-a-very-large-text-file-in-c)看起来相关。 – rtur

+0

为什么不尝试直接使用'file >> some_string;'直接代替首先复制到'stringstream' – Arunmu

+2

另外,你是否计划发布,优化你的应用程序的构建?还是它是一个“调试”,未优化的版本? – PaulMcKenzie

回答

-1

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

+2

Uhm,C++流*默认被缓冲,可以直接或通过stdio(缓冲);此外,即使操作系统缓冲区读取,所以他不太可能连续地点击磁盘。 –

+0

hımm,我不知道。有可能缓冲区大小很小?如果这样手动更改缓冲区大小可能会有所帮助 – Dante