У меня есть большие файлы .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;
}
Этот ответ [Эффективное чтение очень большого текстового файла в C++] (http://stackoverflow.com/questions/26736742/efficiently-reading-a-very-large-text-file-in-c) выглядит актуальным , – rtur
Почему вы не пытаетесь использовать только 'file >> some_string;' непосредственно вместо первого копирования в 'stringstream' – Arunmu
Также вы задаете время для создания оптимизированной сборки вашего приложения? Или это «отладка», неоптимизированная версия? – PaulMcKenzie