2016-07-20 7 views
2

У меня есть большие файлы .txt с более чем миллионными линиями и 7-мя номерами поплавков в строке. Столбцы разделены пробелами.Как увеличить скорость чтения файлов?

В настоящее время я импортирую файлы, читая каждую строку (getline), преобразуя строку в поток, а затем сохраняя семь значений в переменных массива (см. Мой минимальный пример). Однако эта процедура довольно медленная и занимает около 10 минут для 3 миллионов линий (500 МБ). Это соответствует 0,8 Мбайт/с и намного медленнее, чем требуется для записи файлов. Мой жесткий диск - 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; 
} 
+2

Этот ответ [Эффективное чтение очень большого текстового файла в 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

 Смежные вопросы

  • Нет связанных вопросов^_^