Если Вы имеете дело с кодом аппаратного интерфейса, автор кода, на который Вы смотрите, возможно, определил int_t
, чтобы быть определенным целым числом размера. Стандарт C не присваивает определенный размер int
тип (это зависит от Вашего компилятора и целевой платформы, потенциально), и использование определенного int_t
, тип избежал бы той проблемы мобильности.
Это - особенно важное соображение для кода аппаратного интерфейса, который может быть, почему Вы сначала заметили соглашение там.
Из IEEE 1003.1:
Функция mmap () должна установить сопоставление адресов процесса пространство и файл, общая память объект, или [TYM] типизированная память
Ему нужно все виртуальное адресное пространство, потому что это именно то, что mmap ()
делает .
Тот факт, что он не на самом деле исчерпывает память не имеет значения - вы не можете отобразить больше адресного пространства, чем доступно. Поскольку затем вы берете результат и получаете доступ, как если бы он был памятью, как именно вы предлагаете получить доступ к более чем 2 ^ 32 байтам в файл? Даже если mmap ()
не завершился ошибкой, вы все равно могли бы прочитать только первые 4 ГБ, прежде чем у вас закончится место в 32-битном адресном пространстве. Вы можете, конечно, mmap ()
скользящее 32-битное окно над файлом, но это не обязательно принесет вам какую-либо выгоду, если только вы не сможете оптимизировать свой шаблон доступа таким образом, чтобы ограничить количество раз необходимо посетить предыдущие окна.
32-битная программа и операционная система могут адресовать максимум 32 бита памяти т.е. 4 ГБ. Есть и другие факторы, которые делают общую сумму еще меньше; например, Windows резервирует от 0,5 до 2 ГБ для доступа к оборудованию, и, конечно же, ваша программа также займет некоторое место.
Изменить: Очевидная вещь, которую вам не хватает, - это понимание механизма mmap , в любой операционной системе. Это позволяет вам сопоставить часть файла с диапазоном памяти - как только вы это сделаете, любой доступ к этой части файла произойдет с минимально возможными накладными расходами. Это низкие накладные расходы, потому что сопоставление выполняется один раз и не должно изменяться каждый раз, когда вы обращаетесь к другому диапазону. Недостатком является то, что вам нужен диапазон открытых адресов, достаточный для той части, которую вы пытаетесь сопоставить. Если вы отображаете весь файл сразу, вам понадобится дыра в карте памяти, достаточно большая, чтобы вместить весь файл. Если такой дыры не существует или она больше, чем все ваше адресное пространство, она не работает.
модуль mmap предоставляет все инструменты, необходимые для работы с большим файлом, но из-за ограничения, упомянутые другими людьми, вы не можете отобразить его сразу . Вы можете сразу отобразить кусок хорошего размера, выполнить некоторую обработку, а затем отключить его и сопоставить другой. ключевыми аргументами класса mmap
являются length
и offset
, которые делают именно то, на что они похожи, позволяя отображать длину
байтов, начиная с байта смещения
в сопоставленном файле. Каждый раз, когда вы хотите прочитать раздел памяти, который находится за пределами отображаемого окна, вы должны отобразить его в новом окне.
Как упоминалось ранее, управление исходным кодом не похоже на хорошее решение вашей проблемы. Мне кажется, что лучше иметь единую базу кода с использованием мультитенантной архитектуры. Таким образом, вы получаете множество преимуществ с точки зрения управления вашим приложением, нагрузки на службу, масштабируемости и т. Д.
В нашем продукте используется этот подход, и то, что у нас есть, - это некоторые (много) основных функций, которые одинаковы для все клиенты, настраиваемые модули, которые используются одним или несколькими клиентами, и в основном "
Вы устанавливаете параметр длины на ноль, что означает карта во всем файле. В 32-битной сборке это будет невозможно, если длина файла превышает 2 ГБ (возможно, 4 ГБ).
Вы просите ОС отобразить весь файл в диапазоне памяти. Он не будет считан до тех пор, пока вы не вызовете сбои страниц при чтении / записи, но все же необходимо убедиться, что весь диапазон доступен вашему процессу, и если этот диапазон будет слишком большим, возникнут трудности.
Простите за ответ на мой собственный вопрос, но я думаю, что настоящая проблема, с которой я столкнулся, заключалась в том, что я не понимал, что mmap была стандартной системой POSIX вызов с определенными характеристиками и ограничениями, и что Python mmap должен просто раскрывать его функциональность.
В документации Python не упоминается POSIX mmap, и поэтому, если вы приходите к нему как программист Python без особых знаний POSIX (как Я сделал) тогда проблема с адресным пространством кажется довольно произвольной и плохо спроектированной!
Спасибо другим авторам за то, что они научили меня истинному значению mmap. К сожалению, никто не предложил лучшей альтернативы моему ручному классу для обработки больших файлов как строк, так что мне придется пока придерживаться этого. Возможно, я его почищу и сделаю частью своего модуля »