Чтение текстовых файлов - PullRequest
0 голосов
/ 18 января 2010

Я пытаюсь выяснить, как лучше всего читать большие текстовые (не менее 5 МБ) файлы в C ++, учитывая скорость и эффективность. Какой предпочитаемый класс или функцию использовать и почему?

Кстати, я работаю специально в среде UNIX.

Ответы [ 3 ]

0 голосов
/ 18 января 2010

Использовать файл старого стиля io.

fopen the file for binary read
fseek to the end of the file
ftell to find out how many bytes are in the file.
malloc a chunk of memory to hold all of the bytes + 1
set the extra byte at the end of the buffer to NUL.
fread the entire file into memory.
create a vector of const char *
push_back the address of the first byte into the vector.
repeatedly 
    strstr - search the memory block for the carriage control character(s).
    put a NUL at the found position
    move past the carriage control characters
    push_back that address into the vector
until all of the text in the buffer has been processed.

----------------
use the vector to find the strings,
and process as needed.
when done, delete the memory block
and the vector should self-destruct.
0 голосов
/ 18 января 2010

Если вы используете текстовые файлы для хранения целых чисел, чисел с плавающей запятой и небольших строк, мой опыт показывает, что FILE, fopen, fscanf уже достаточно быстрые, а также вы можете получить числа напрямую. Я думаю, что отображение памяти является самым быстрым, но оно требует от вас написания кода для анализа файла, который требует дополнительной работы.

0 голосов
/ 18 января 2010

Потоковые классы (ifstream) на самом деле делают хорошую работу; при условии, что вы не ограничены, в противном случае обязательно отключите sync_with_stdio (в ios_base: :). Вы можете использовать getline () для непосредственного чтения в std :: strings, хотя с точки зрения производительности использование фиксированного буфера в качестве char * (вектор символов char или old-school char []) может быть быстрее (с более высоким риском / сложностью ).

Вы можете пойти по пути mmap, если хотите играть в игры с расчетами размера страницы и тому подобным. Я, вероятно, сначала построю его с использованием потоковых классов и посмотрю, достаточно ли это хорошо.

В зависимости от того, что вы делаете с каждой строкой данных, вы можете начать находить, что ваши процедуры обработки - это точка оптимизации, а не ввод-вывод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...