Что ограничивает размер файла с отображением памяти? Я знаю, что он не может быть больше, чем самый большой непрерывный кусок нераспределенного адресного пространства, и что должно быть достаточно свободного места на диске. Но существуют ли другие ограничения?
Насколько большой может быть файл с отображением памяти?
Ответ 1
Вы слишком консервативны: файл с отображением памяти может быть больше адресного пространства. представление файла с отображением памяти ограничено ограничениями памяти ОС, но это только часть файла, который вы просматриваете за один раз. (И я предполагаю, что технически вы могли одновременно отображать несколько представлений о прерывистых частях файла, поэтому в стороне от ограничений служебной информации и длины страницы это всего лишь количество байтов, на которые вы смотрите, создает предел. Вы можете посмотреть байты [0 - 1024] и байты [2 40 до 2 40 + 1024] с двумя отдельными видами.)
В MS Windows просмотрите функцию MapViewOfFile. Он эффективно принимает 64-битное смещение файла и 32-разрядную длину.
Ответ 2
Это был мой опыт при использовании файлов с отображением памяти под Win32:
Если ваша карта содержит весь файл в один сегмент, он обычно отключается примерно на 750 МБ, потому что он не может найти более широкий непрерывный блок памяти. Если вы разделите его на более мелкие сегменты, скажем, 100 МБ каждый, вы можете получить около 1500 МБ-1800 МБ в зависимости от того, что еще работает.
Если вы используете переключатель /3g, вы можете получить более 2 ГБ до 2700 МБ, но производительность ОС будет наказываться.
Я не уверен в 64-битных, я никогда не пробовал, но я предполагаю, что максимальный размер файла ограничивается только объемом физической памяти.
Ответ 3
Не должно быть никаких других ограничений. Разве это недостаточно?; -)
Ответ 4
В Windows: "Размер представления файла ограничен самым большим доступным непрерывным блоком незарезервированной виртуальной памяти. Это не более 2 ГБ минус виртуальная память, уже зарезервированная процессом".
От MDSN.
Я не уверен в LINUX/OSX/Anyething Else, но, вероятно, также связан с адресным пространством.
Ответ 5
С FUSE в linux вы также можете создать файловую систему в памяти, которая распространяется на диск по требованию. Я не уверен, что это соответствует отображению памяти, и различие становится размытым.
Ответ 6
Да, для отображаемых в память файлов существуют ограничения. Наиболее шокирующим является:
Размер отображаемых в память файлов не может превышать 2 ГБ в 32-разрядных системах.
Когда memmap вызывает создание или расширение файла в файловой системе сверх его текущего размера, содержимое новой части не указывается. В системах с семантикой файловой системы POSIX расширенная часть будет заполнена нулевыми байтами.
Даже в моей 64-битной системе с 32 ГБ ОЗУ я получаю следующую ошибку, если пытаюсь прочитать один большой файл с отображенной памятью вместо того, чтобы брать его части с помощью смещения байтов:
Overflow Error: memory mapped size must be positive
Большие наборы данных - действительно трудная работа.
Ответ 7
Запись в Википедии по теме: http://en.wikipedia.org/wiki/Memory-mapped_file