Каков максимальный размер файла в 64-битной системе с использованием карт памяти

Я пытаюсь работать с большим файлом ~ примерно 50 ГБ. Я пытаюсь получить доступ к итерации по файлу, используя привязку памяти. Я вижу, что существует ограничение на размер файла, который будет использоваться для отображения памяти, который составляет 2 ГБ для 32-битных систем. Вот ссылка: https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.memmap.html

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

1 ответ

Обычно вам не нужно беспокоиться о пределе для 64-битных mmap, но я объясню почему.


Во-первых, теоретически 32-битные платформы могут поддерживать до 2**32или 4 ГБ. Но ОС оставляет за собой часть этого для себя. В Windows этот блок по умолчанию занимает целых 2 ГБ (вы можете настроить его на меньшее, но некоторые программы могут сломаться, так как предполагается, что безопасно использовать "подписанные указатели"), в то время как на других платформах он обычно больше 512 МБ.

Аналогично, теоретически 64-битные платформы могут поддерживать до 2**64или 16EB. Здесь, то, резервирует ли ОС 512 МБ или 2 ГБ, не будет иметь существенного значения.


Тем не менее, ваше оборудование может ограничить что-то между 44 и 56 битами (большинство современных систем являются 48-битными), а 44 бита - только 256 ТБ.

И ваша ОС может ограничивать вещи еще дальше. IIRC, самые ранние 64-битные ядра Linux, использовали только 40 бит (потому что в то время не было оборудования, которое могло бы использовать больше), что составляет всего 1 ТБ.

Наконец, в Windows, если вы используете "базовую" или "начальную" редакцию, она может еще больше ограничиться 8 ГБ для Windows 8 Home Basic Edition. Это единственный, который может повлиять на ваш файл.


Но, в отличие от более поздних 32-битных дней, почти никто в 2018 году не имеет больше физической оперативной памяти, чем их ОС может одновременно просматривать страницы. Множество людей используют 32-битную Windows (или 32-битный Python в 64-битной Windows) на машинах с более чем 4 ГБ ОЗУ, но практически невозможно загрузить 64-битную систему с 40-битной ОС с более чем 1 ТБ ОЗУ.

Таким образом, сколько бы оперативной памяти у вас не было, вы сможете использовать большую ее часть для mmap,


Иногда вы хотите mmap файл, который на самом деле не помещается в вашей оперативной памяти. Затем вы будете полагаться на обмен страницами в ОС, который, конечно, будет менее эффективен, чем оконные карты меньшего размера, но может быть достаточно эффективным и может быть намного проще.

В этом случае он, вероятно, будет работать в вашей системе, но на самом деле невозможно сказать наверняка, не зная намного больше, чем вы нам сказали. И самый простой ответ (как обычно для Python) - это EAFP: попробуйте его и подготовьтесь к обработке исключения, когда оно выходит из строя (либо программно, либо просто читая трассировку стека и ища решение в Stackru).

Другие вопросы по тегам