Как выполнить быстрый форматированный ввод из потока в C ++? - PullRequest
5 голосов
/ 16 марта 2009

Ситуация такова: существует файл с 14 294 508 целыми числами без знака и 13 994 397 числами с плавающей точкой (необходимо прочитать double с) Общий размер файла ~ 250 МБ.

Использование std::istream занимает ~ 30сек. Чтение данных из файла в память (просто копирование байтов без форматированного ввода) выполняется намного быстрее. Есть ли способ улучшить скорость чтения без изменения формата файла?

Ответы [ 5 ]

3 голосов
/ 16 марта 2009

Вам нужно использовать ввод / вывод в стиле STL? Вы должны проверить эту отличную работу от одного из экспертов. Это специализированный iostream Дитмар Куль.

Я не хочу предлагать это, но взгляну на отформатированные процедуры ввода / вывода на языке C. Кроме того, вы читаете весь файл за один раз?

1 голос
/ 17 марта 2009

Парсинг ввода самостоятельно (atoi & atof) обычно повышает скорость как минимум вдвое по сравнению с «универсальными» методами чтения.

1 голос
/ 16 марта 2009

Вы не указали формат. Вполне возможно, что вы можете отобразить это в памяти или прочитать очень большие куски и обработать в пакетном алгоритме.

Кроме того, вы еще не сказали, знаете ли вы точно, что файл и процесс, которые будут его читать, будут на одной платформе. Если процесс с прямым порядком байтов записывает его, а процесс с прямым порядком байтов читает его, или наоборот, он не будет работать.

1 голос
/ 16 марта 2009

Возможно, вы захотите взглянуть на библиотеку Мэтью Уилсона FastFormat:

Я не использовал его, но он делает довольно внушительные заявления, и я обнаружил, что многие другие его работы заслуживают изучения и использования (и кражи по случаю).

0 голосов
/ 22 марта 2009

Что-то быстрое и грязное - просто выгрузить файл в стандартную строку C ++, а затем использовать для этого поток строк:

#include <sstream>
// Load file into string file_string
std::stringstream s( file_string );
int x; float y;
s >> x >> y;

Это может не дать вам большого улучшения производительности (вы получите большее ускорение, избегая iostreams), но это очень легко попробовать, и это может быть достаточно быстрее.

...