2009-04-07 4 views
23

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

+0

Платформа? Windows или Linux? –

ответ

24

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

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

+0

Да, я должен был сказать «взгляд». Мне нужно иметь доступ ко всему файлу за один раз, без re-mmapp() ing. – user88185

+0

MapViewOfFile занимает 64-разрядную длину на 64-разрядной машине – springy76

+0

. В любом случае можно передать ZERO для размера, что означает «размером с файл» –

1

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

+0

На 64-битной ОС эти ограничения кажутся довольно слабыми ... – user88185

1

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

От MDSN.

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

+1

просто для того, чтобы уточнить, что размер файла, а не размер самого файла. –

+5

«2 ГБ минус виртуальная память, уже зарезервированная процессом», находится на 32-битной машине? Разве это на 64-битной коробке? – user88185

0

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

-3

Википедии запись на тему: http://en.wikipedia.org/wiki/Memory-mapped_file

+0

Я не видел других ограничений, упомянутых в этой статье в Википедии, означает ли это, что их нет? – user88185

+1

Хотя это теоретически может ответить на вопрос, [было бы предпочтительнее] (http: //meta.stackoverflow.com/q/8259), чтобы включить здесь основные части ответа и предоставить ссылку для справки. –

9

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

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

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

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

+0

В 64-битном лимите доступно доступное адресное пространство, то же, что и на 32-битном. Вы можете отобразить представление 1 ГБ на 32-битной машине, которая имеет только физическую память 32 МБ. Точно так же вы можете сопоставить представление 10TB на 32-битной машине, которая имеет только 0,5 ГБ памяти. Только 4kb-страницы, которые вы действительно получаете, отображаются в реальную память. – springy76

+1

@ springy76: вы не можете отобразить представление 10TB на 32-битной машине. Только на 64-битной. –

+4

@SergeyK. вы чертовски правы, вот и то, что я хотел написать, - но пальцы набрали что-то еще. Он должен был прочитать «Точно так же вы можете сопоставить представление 10TB на 64-битной машине, которая имеет только 0,5 ГБ памяти» – springy76