Почему mmap Python не работает с большими файлами?

Если Вы имеете дело с кодом аппаратного интерфейса, автор кода, на который Вы смотрите, возможно, определил int_t, чтобы быть определенным целым числом размера. Стандарт C не присваивает определенный размер int тип (это зависит от Вашего компилятора и целевой платформы, потенциально), и использование определенного int_t, тип избежал бы той проблемы мобильности.

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

44
задан Yaakov Belch 31 January 2017 в 19:36
поделиться

7 ответов

Из IEEE 1003.1:

Функция mmap () должна установить сопоставление адресов процесса пространство и файл, общая память объект, или [TYM] типизированная память

Ему нужно все виртуальное адресное пространство, потому что это именно то, что mmap () делает .

Тот факт, что он не на самом деле исчерпывает память не имеет значения - вы не можете отобразить больше адресного пространства, чем доступно. Поскольку затем вы берете результат и получаете доступ, как если бы он был памятью, как именно вы предлагаете получить доступ к более чем 2 ^ 32 байтам в файл? Даже если mmap () не завершился ошибкой, вы все равно могли бы прочитать только первые 4 ГБ, прежде чем у вас закончится место в 32-битном адресном пространстве. Вы можете, конечно, mmap () скользящее 32-битное окно над файлом, но это не обязательно принесет вам какую-либо выгоду, если только вы не сможете оптимизировать свой шаблон доступа таким образом, чтобы ограничить количество раз необходимо посетить предыдущие окна.

37
ответ дан 26 November 2019 в 22:01
поделиться

32-битная программа и операционная система могут адресовать максимум 32 бита памяти т.е. 4 ГБ. Есть и другие факторы, которые делают общую сумму еще меньше; например, Windows резервирует от 0,5 до 2 ГБ для доступа к оборудованию, и, конечно же, ваша программа также займет некоторое место.

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

16
ответ дан 26 November 2019 в 22:01
поделиться

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

9
ответ дан 26 November 2019 в 22:01
поделиться

Как упоминалось ранее, управление исходным кодом не похоже на хорошее решение вашей проблемы. Мне кажется, что лучше иметь единую базу кода с использованием мультитенантной архитектуры. Таким образом, вы получаете множество преимуществ с точки зрения управления вашим приложением, нагрузки на службу, масштабируемости и т. Д.

В нашем продукте используется этот подход, и то, что у нас есть, - это некоторые (много) основных функций, которые одинаковы для все клиенты, настраиваемые модули, которые используются одним или несколькими клиентами, и в основном "

6
ответ дан 26 November 2019 в 22:01
поделиться

Вы устанавливаете параметр длины на ноль, что означает карта во всем файле. В 32-битной сборке это будет невозможно, если длина файла превышает 2 ГБ (возможно, 4 ГБ).

2
ответ дан 26 November 2019 в 22:01
поделиться

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

1
ответ дан 26 November 2019 в 22:01
поделиться

Простите за ответ на мой собственный вопрос, но я думаю, что настоящая проблема, с которой я столкнулся, заключалась в том, что я не понимал, что mmap была стандартной системой POSIX вызов с определенными характеристиками и ограничениями, и что Python mmap должен просто раскрывать его функциональность.

В документации Python не упоминается POSIX mmap, и поэтому, если вы приходите к нему как программист Python без особых знаний POSIX (как Я сделал) тогда проблема с адресным пространством кажется довольно произвольной и плохо спроектированной!

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

17
ответ дан 26 November 2019 в 22:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: