Если файл представляет собой текстовый файл, он, вероятно, состоит из строк разумного размера. Затем вы можете попытаться прочитать его построчно, например. с помощью std::getline (или, в C, getline(3))
Если вы находитесь в системе Posix, например. Linux можно использовать низкоуровневые системные вызовы(2), например read(2) или mmap(2). Убедитесь, что у вас достаточно большие буферы, например. 16Кбайт или 64Кбайт.
Кстати, если в Linux попробуйте time wc yourbigfile
, это должно дать вам представление о нижней границе времени, действительно необходимого для чтения вашего файла. Помните, что существует кеш файловой системы: подробнее см. http://linuxatemyram.com/.
на моей настольной системе Linux wc
из 6 МБ файл размером 100 КБ занимает около 0,1 секунды в реальном времени.
Возможно, прочитайте Advanced Linux Programming, по крайней мере, если вы запускаете свою программу в системах Posix.
Кстати, ваш вопрос касается операционной системы и, возможно, конкретной файловой системы.
person
Basile Starynkevitch
schedule
24.09.2014
fgetc_unlocked
, если это предусмотрено вашей реализацией. - person Deduplicator   schedule 24.09.2014std::getc
можно реализовать как макрос (что мне кажется забавным, учитывая его с указанием пространства имен). Это сделано преднамеренно (часть макроса), она потенциально снижает накладные расходы на вызовы, если только не требуется пополнение буфера. Стоит попробовать протестировать его (конечно, в релизной сборке). И я согласен с Deduplicator, заблокируйте файл спереди и не забудьте разблокировать его, когда закончите. - person WhozCraig   schedule 24.09.2014fgetc
увеличивает скорость еще на 150 мс или около того, так что я поддерживаю дедупликатор. - person WhozCraig   schedule 24.09.2014std::vector<char>
.malloc
нет места в современной программе на C++. - person WhozCraig   schedule 24.09.2014