Чтение огромных файлов с помощью Memory Mapped Files - PullRequest
7 голосов
/ 08 марта 2012

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

Как это меняется с 64-битным процессом, где адресное пространство резкоувеличивается?Если мне нужен случайный доступ к файлу, есть ли причина не отображать весь файл сразу?(файл десятки ГБ)

Ответы [ 3 ]

6 голосов
/ 08 марта 2012

На 64-битных картах перейдите к отображению файла.

Одна вещь, на которую следует обратить внимание, основываясь на опыте Linux: если доступ действительно случайный и файл намного больше, чем вы можете ожидать, чтобы кэшировать в ОЗУ (так что шансы снова попасть на страницу невелики) тогда может быть целесообразно указать от MADV_RANDOM до madvise , чтобы неуклонно остановить накопление страниц с хитовыми файлами и бессмысленно заменять другие действительно полезные вещи.Не знаю, что такое эквивалентный Windows API .

5 голосов
/ 08 марта 2012

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

При чтении файла «условно» - любая ошибка ввода-вывода сообщается соответствующей возвращаемой функцией функцией.Остальная часть обработки ошибок зависит от вас.

OTOH, если ошибка возникает во время неявного ввода-вывода (в результате сбоя страницы и попытки загрузить нужную часть файла в соответствующую страницу памяти) - ошибкаМеханизм обработки зависит от ОС.

В Windows обработка ошибок выполняется с помощью SEH - так называемая «структурированная обработка исключений».Исключение распространяется на пользовательский режим (код приложения), где у вас есть шанс обработать его правильно.Правильная обработка требует, чтобы вы компилировали с соответствующими настройками обработки исключений в компиляторе (чтобы гарантировать вызов деструкторов, если применимо).

Я не знаю, как выполняется обработка ошибок в unix / linuxхотя.

PS Я не говорю, что не использует отображенные в памяти файлы.Я говорю делай это осторожно

2 голосов
/ 08 марта 2012

Следует помнить одну вещь: для отображения памяти требуются большие непрерывные порции (виртуальной) памяти при создании отображения;в 32-разрядной системе это особенно отстой, потому что в загруженной системе получение длинных запусков непрерывного ОЗУ маловероятно и сопоставление не удастся.В 64-битной системе это намного проще, так как верхняя граница 64-битной ... огромна.

Если вы выполняете код в контролируемых средах (например, 64-битных серверных средах, которые вы создаете сами изнать, как правильно выполнить этот код) иди и сопоставь весь файл и просто разберись с ним.

Если вы пытаетесь написать код общего назначения, который будет в программном обеспечении, которое может работать на любом количестве типовконфигурации, вы захотите придерживаться меньшей картографической стратегии.Например, сопоставление больших файлов с коллекциями блоков по 1 ГБ и наличие уровня абстракции, который принимает такие операции, как read (offset) и преобразует их в смещение в правом фрагменте перед выполнением операции

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