Насколько большим может быть отображенный в память файл? - PullRequest
24 голосов
/ 07 апреля 2009

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

Ответы [ 7 ]

24 голосов
/ 07 апреля 2009

Вы слишком консервативны: отображаемый в память файл может быть больше адресного пространства. представление файла с отображением в памяти ограничено ограничениями памяти ОС, но это только часть файла, которую вы просматриваете за один раз. (И я полагаю, что технически вы могли бы отобразить несколько представлений прерывистых частей файла одновременно, так что, помимо ограничений по накладным расходам и длине страницы, только общее количество байтов, на которое вы просматриваете, представляет собой ограничение. Вы можете посмотреть на байты [От 0 до 1024] и байты [2 40 до 2 40 + 1024] с двумя отдельными представлениями.)

В MS Windows посмотрите на функцию MapViewOfFile . Он эффективно принимает 64-битное смещение файла и 32-битную длину.

9 голосов
/ 27 октября 2009

Это мой опыт использования отображаемых в памяти файлов под Win32:

Если вы отображаете весь файл в один сегмент, он обычно занимает около 750 МБ, потому что не может найти больший непрерывный блок памяти. Если вы разделите его на более мелкие сегменты, скажем, по 100 МБ каждый, вы можете получить около 1500–1800 МБ в зависимости от того, что еще работает.

Если вы используете переключатель / 3g , вы можете получить более 2 ГБ до примерно 2700 МБ, но производительность ОС снижается.

Я не уверен насчет 64-битной, я никогда не пробовал, но я предполагаю, что максимальный размер файла будет ограничен только объемом вашей физической памяти.

1 голос
/ 07 апреля 2009

В Windows: «Размер представления файла ограничен самым большим доступным непрерывным блоком незарезервированной виртуальной памяти. Это не более 2 ГБ минус виртуальная память, уже зарезервированная процессом.»

С MDSN .

Я не уверен насчет LINUX / OSX / что угодно, но это, вероятно, также связано с адресным пространством.

1 голос
/ 07 апреля 2009

Других ограничений быть не должно. Разве этого недостаточно? ; -)

0 голосов
/ 09 апреля 2018

Да, существуют ограничения для отображаемых в память файлов. Самое шокирующее это:

Файлы с отображением в памяти не могут превышать 2 ГБ в 32-разрядных системах.

Когда memmap вызывает создание или расширение файла в файловой системе сверх его текущего размера, содержимое новой части не указывается. В системах с семантикой файловой системы POSIX расширенная часть будет заполнена нулевыми байтами.

Даже в моей 64-разрядной системе ОЗУ объемом 32 ГБ я получаю следующую ошибку, если пытаюсь прочитать один большой файл с отображенной памятью вместо того, чтобы брать его части с помощью смещения байтов:

Overflow Error: memory mapped size must be positive

С большими наборами данных работать очень тяжело.

0 голосов
/ 07 апреля 2009

Википедия по теме: http://en.wikipedia.org/wiki/Memory-mapped_file

0 голосов
/ 07 апреля 2009

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

...