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

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

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


person Delta    schedule 10.04.2018    source источник
comment
Это связано с этим вопросом?   -  person tadman    schedule 10.04.2018
comment
Текущие процессоры x86_64 имеют 48-битное жесткое ограничение на размер адресного пространства, но вы закончите физическую оперативную память, необходимую для хранения записей страниц, до того, как нажмете ее.   -  person Matteo Italia    schedule 10.04.2018
comment
У вас действительно больше 50 ГБ ОЗУ? Если да, то ответ почти наверняка да. Если нет, вы просто надеетесь, что страницы подкачки ОС будут более эффективными или простыми, чем работа с mmap или чем-то подобным (это не будет более эффективным, но может быть достаточно эффективным…), ответ, вероятно, да, но попробуй и увидишь. Для получения полной информации см. мой ответ.   -  person abarnert    schedule 10.04.2018


Ответы (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: попробуйте и подготовьтесь к обработке исключения в случае сбоя (либо программно, либо просто прочитав трассировку стека и выполнив поиск решения в StackOverflow).

person abarnert    schedule 10.04.2018