mmap () для ввода / вывода большого файла? - PullRequest
4 голосов
/ 21 апреля 2010

Я создаю утилиту на C ++ для работы в Linux, которая может конвертировать видео в собственный формат.Видеокадры очень большие (до 16 мегапикселей), и мы должны иметь возможность непосредственно искать точные номера кадров, поэтому наш формат файла использует libz для сжатия каждого кадра по отдельности и добавления сжатых данных в файл.После завершения записи всех фреймов в конец файла записывается журнал, который включает метаданные для каждого фрейма (включая их смещения и размеры).

В настоящее время я использую ifstream и ofstream для файлового ввода-вывода, но я стараюсь максимально оптимизировать.Я слышал, что mmap () может увеличить производительность во многих случаях, и мне интересно, является ли мой одним из них.Наши файлы будут иметь размеры от десятков до сотен гигабайт, и хотя запись всегда будет выполняться последовательно, чтение с произвольным доступом должно выполняться в постоянное время.Есть какие-нибудь мысли о том, стоит ли мне исследовать это дальше, и если да, то есть ли у кого-нибудь какие-либо советы по поводу того, на что стоит обратить внимание?

Ответы [ 2 ]

8 голосов
/ 21 апреля 2010

На 32-битной машине ваш процесс ограничен 2-3 ГБ адресного пространства пользователя. Это означает, что (с учетом другого использования памяти) вы не сможете отобразить более ~ 1 ГБ файла за раз. Это НЕ означает, что вы не можете использовать mmap() для очень больших файлов - просто вам нужно отобразить только часть файла за один раз.

При этом, mmap() все еще может быть большим выигрышем для больших файлов. Наиболее существенным преимуществом является то, что вы не тратите память на хранение данных ДВАЖДЫ - одна копия в системном кеше, одна копия в личном буфере вашего приложения - и процессорное время для создания этих копий. Это может быть еще более значительное ускорение для произвольного доступа, но «случайная» часть должна быть ограничена в диапазоне с вашими текущими отображениями.

6 голосов
/ 21 апреля 2010

Если ваши файлы имеют размер 10 ГБ или более, даже не думайте о попытке использовать mmap() в 32-разрядной архитектуре. Перейдите непосредственно к 64-битной ОС, которая должна нормально с ней справляться.

Обратите внимание, что файлы, отображаемые в пространство памяти, на самом деле не используют тот же объем ОЗУ (что и размер файла), поэтому вам не нужно устанавливать сотни гигабайт ОЗУ на вашем компьютере.

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