Чтение из файла или чтение файла в буфер, а затем использовать буфер (в C ++)? - PullRequest
0 голосов
/ 10 октября 2011

Я пишу парсер, в котором мне нужно читать символы из файла. Но я буду читать файл символ за символом, и даже может прекратить чтение в середине, если условия не будут удовлетворительными.

Так что рекомендуется создать ifstream файла и каждый раз искать его позицию и начинать чтение с него, или мне следует прочитать весь файл в поток или буфер, а затем использовать его вместо ??

Ответы [ 4 ]

1 голос
/ 10 октября 2011

Если вы можете, используйте отображенный в памяти файл.

Boost предлагает кроссплатформенный: http://www.boost.org/doc/libs/1_35_0/libs/iostreams/doc/classes/mapped_file.html

1 голос
/ 10 октября 2011

Насколько велик файл?Вы делаете больше, чем один проход?Читаете ли вы это в буфере в памяти или нет, чтение файла потребует (размер файла / BUFSIZ) чтения, чтобы пройти через все это.Чтение символ за символом не имеет значения, потому что базовое чтение все еще потребляет байты BUFSIZ за раз (если вы не предпримете шаги, чтобы изменить это поведение) - оно просто передает их символ за символом.

Есливы все равно читаете и обрабатываете его за один проход, затем чтение в память будет означать, что вы всегда нуждаетесь (размер файла / BUFSIZ), где - при условии, что причина остановки распределена равновероятно- чтение и обработка в строке займет в среднем (размер файла / BUFSIZ) * 0,5 чтения, что для большого файла может принести существенный выигрыш.

Еще более важный вопрос может быть «чтовы ищете это сложное решение? "Время, затрачиваемое на выяснение симпатичного решения, вероятно, преобладает над всеми выгодами, которые вы получите от поиска чего-то более изумительного, чем стандартное решение «пока не конец файла, получите символ и процесс».

0 голосов
/ 10 октября 2011

В ОС с полным сервисом (например, Windows, Mac OS, Linux, BSD ...) операционная система будет иметь механизм кэширования, который до некоторой степени обрабатывает это (и при условии, что ваши шаблоны использования соответствуют определению «обычный «).

Если вы не испытываете неприемлемую производительность, возможно, вы захотите весело игнорировать всю проблему (т. Е. Просто использовать наивные примитивы доступа к файлам).

0 голосов
/ 10 октября 2011

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

Попробуйте прочитать все содержимое файла с натяжкой в ​​буфер, а затем обработать последующие входные данные с буфером и без чтения из файла каждый раз ,,

...