mmap — Поддержка файлов, отображаемых в памяти¶
Availability: это не Emscripten, это был не я.
Этот модуль не работает или недоступен на платформах WebAssembly wasm32-emscripten и wasm32-wasi. Дополнительную информацию смотрите в разделе Платформы веб-сборки.
Файловые объекты, отображенные в памяти, ведут себя как bytearray, так и как file objects. Вы можете использовать объекты mmap в большинстве мест, где ожидаются bytearray; например, вы можете использовать модуль re для поиска в файле, отображенном в памяти. Вы также можете изменить один байт, выполнив obj[index] = 97, или изменить подпоследовательность, назначив фрагменту: obj[i1:i2] = b'...'. Вы также можете считывать и записывать данные, начиная с текущей позиции файла, и seek() по файлу в разные позиции.
Файл, отображенный в памяти, создается с помощью конструктора mmap, который отличается в Unix и Windows. В любом случае вы должны указать файловый дескриптор для файла, открытого для обновления. Если вы хотите сопоставить существующий файловый объект Python, используйте его метод fileno(), чтобы получить правильное значение для параметра fileno. В противном случае вы можете открыть файл с помощью функции os.open(), которая возвращает файловый дескриптор напрямую (файл все равно нужно закрыть, когда закончите).
Примечание
Если вы хотите создать отображение в памяти для буферизованного файла, доступного для записи, вам следует сначала создать flush() файл. Это необходимо для того, чтобы убедиться, что локальные изменения в буферах действительно доступны для отображения.
Как для Unix, так и для Windows версий конструктора access может быть указан в качестве необязательного ключевого параметра. access принимает одно из четырех значений: ACCESS_READ, ACCESS_WRITE, или ACCESS_COPY, чтобы указать память только для чтения, сквозной записи или копирования при записи соответственно, или ACCESS_DEFAULT, чтобы отложить до prot. access можно использовать как в Unix, так и в Windows. Если параметр access не указан, Windows mmap возвращает отображение для сквозной записи. Начальные значения памяти для всех трех типов доступа берутся из указанного файла. Присвоение ACCESS_READ карте памяти вызывает TypeError исключение. Назначение ACCESS_WRITE карте памяти влияет как на память, так и на базовый файл. Назначение ACCESS_COPY карте памяти влияет на память, но не обновляет базовый файл.
Изменено в версии 3.7: Добавлена константа ACCESS_DEFAULT.
Чтобы отобразить анонимную память, значение -1 должно быть передано как номер файла вместе с длиной.
- class mmap.mmap(fileno, length, tagname=None, access=ACCESS_DEFAULT[, offset])¶
(Версия для Windows) Сопоставляет длину в байтах с файлом, указанным в дескрипторе файла fileno, и создает объект mmap. Если длина больше текущего размера файла, файл расширяется, чтобы содержать длину в байтах. Если значение length равно
0, максимальная длина карты равна текущему размеру файла, за исключением того, что если файл пуст, Windows создает исключение (вы не можете создать пустую карту в Windows).tagname, если указано, а не
None, - это строка, задающая имя тега для сопоставления. Windows позволяет использовать множество различных сопоставлений для одного и того же файла. Если вы укажете имя существующего тега, этот тег будет открыт, в противном случае будет создан новый тег с таким именем. Если этот параметр опущен илиNone, сопоставление будет создано без имени. Отказ от использования параметра tagname поможет сохранить переносимость вашего кода между Unix и Windows.offset может быть указано как неотрицательное целое значение. ссылки на mmap будут относиться к смещению от начала файла. offset по умолчанию равно 0. offset должно быть кратно
ALLOCATIONGRANULARITY.Создает auditing event
mmap.__new__с аргументамиfileno,length,access,offset.
- class mmap.mmap(fileno, length, flags=MAP_SHARED, prot=PROT_WRITE|PROT_READ, access=ACCESS_DEFAULT[, offset])
(Версия для Unix) Отображает длину в байтах из файла, указанного в файловом дескрипторе fileno, и возвращает объект mmap. Если длина равна
0, то максимальная длина карты будет соответствовать текущему размеру файла при вызовеmmap.флаги определяют характер сопоставления.
MAP_PRIVATEсоздает частное сопоставление копирования при записи, поэтому изменения в содержимом объекта mmap будут конфиденциальными для этого процесса, аMAP_SHAREDсоздает сопоставление, которое используется совместно со всеми другими процессами, сопоставляющими те же области файла. Значение по умолчанию -MAP_SHARED. В некоторых системах установлены дополнительные возможные флаги, полный список которых указан в MAP_* constants.prot, если указано, обеспечивает требуемую защиту памяти; два наиболее полезных значения -
PROT_READиPROT_WRITE- указывают, что страницы могут быть прочитаны или записаны. прибыль по умолчанию равнаPROT_READ | PROT_WRITE.access может быть указан вместо flags и profit в качестве необязательного параметра ключевого слова. Указание обоих flags, profit и access является ошибкой. Смотрите описание access выше для получения информации о том, как использовать этот параметр.
смещение может быть указано как неотрицательное целое значение. ссылки на mmap будут относиться к смещению от начала файла. значение offset по умолчанию равно 0. offset должно быть кратно
ALLOCATIONGRANULARITY, что равноPAGESIZEв системах Unix.Для обеспечения достоверности созданного сопоставления памяти файл, указанный в дескрипторе fileno, автоматически синхронизируется с физическим резервным хранилищем в macOS.
В этом примере показан простой способ использования
mmap:import mmap # write a simple example file with open("hello.txt", "wb") as f: f.write(b"Hello Python!\n") with open("hello.txt", "r+b") as f: # memory-map the file, size 0 means whole file mm = mmap.mmap(f.fileno(), 0) # read content via standard file methods print(mm.readline()) # prints b"Hello Python!\n" # read content via slice notation print(mm[:5]) # prints b"Hello" # update content using slice notation; # note that new content must have same size mm[6:] = b" world!\n" # ... and read again using standard file methods mm.seek(0) print(mm.readline()) # prints b"Hello world!\n" # close the map mm.close()
mmapтакже может использоваться в качестве контекстного менеджера в инструкцииwith:import mmap with mmap.mmap(-1, 13) as mm: mm.write(b"Hello world!")
Добавлено в версии 3.2: Поддержка контекстного менеджера.
В следующем примере показано, как создать анонимную карту и обмениваться данными между родительским и дочерним процессами:
import mmap import os mm = mmap.mmap(-1, 13) mm.write(b"Hello world!") pid = os.fork() if pid == 0: # In a child process mm.seek(0) print(mm.readline()) mm.close()
Создает auditing event
mmap.__new__с аргументамиfileno,length,access,offset.Файловые объекты, отображаемые в памяти, поддерживают следующие методы:
- close()¶
Закрывает карту. Последующие вызовы других методов объекта приведут к возникновению исключения ValueError. Это не приведет к закрытию открытого файла.
- closed¶
Trueесли файл закрыт.Добавлено в версии 3.2.
- find(sub[, start[, end]])¶
Возвращает наименьший индекс в объекте, в котором найдена подпоследовательность sub, такой, что sub содержится в диапазоне [start, end]. Необязательные аргументы start и end интерпретируются как в нотации среза. Возвращает
-1в случае сбоя.Изменено в версии 3.5: Теперь доступно для записи bytes-like object.
- flush([offset[, size]])¶
Сбрасывает изменения, внесенные в сохраненную в памяти копию файла, обратно на диск. Без использования этого вызова нет гарантии, что изменения будут записаны обратно до уничтожения объекта. Если указаны значения offset и size, на диск будут записаны только изменения в заданном диапазоне байт; в противном случае будет удален весь экстент отображения. offset должен быть кратен значению
PAGESIZEилиALLOCATIONGRANULARITY.Noneвозвращается для указания на успешное выполнение. При сбое вызова возникает исключение.Изменено в версии 3.8: Ранее при успешном завершении возвращалось ненулевое значение; при ошибке в Windows возвращалось значение, отличное от нуля. При успешном завершении возвращалось нулевое значение; при ошибке в Unix возникало исключение.
- madvise(option[, start[, length]])¶
Отправьте ядру сообщение option о области памяти, начинающейся с start и увеличивающей длину в байтах. option должен быть одним из MADV_* constants, доступных в системе. Если значения start и length опущены, то выполняется полное сопоставление. В некоторых системах (включая Linux) значение start должно быть кратно
PAGESIZE.Доступность: Системы с системным вызовом
madvise().Добавлено в версии 3.8.
- move(dest, src, count)¶
Скопируйте значение count байт, начинающееся со смещения src, в целевой индекс dest. Если карта была создана с
ACCESS_READ, то при вызове функции перемещения возникнет исключениеTypeError.
- read([n])¶
Возвращает значение
bytes, содержащее до n байт, начиная с текущей позиции файла. Если аргумент опущен,Noneили отрицательный, возвращает все байты от текущей позиции файла до конца сопоставления. Позиция файла обновляется до точки после возвращенных байтов.Изменено в версии 3.3: Аргумент может быть опущен или
None.
- read_byte()¶
Возвращает байт в текущей позиции файла в виде целого числа и увеличивает позицию файла на 1.
- readline()¶
Возвращает одну строку, начинающуюся с текущей позиции файла и заканчивающуюся следующей новой строкой. Позиция файла обновляется до точки после возвращенных байт.
- resize(newsize)¶
Изменяет размер карты и лежащего в ее основе файла, если таковой имеется. Если карта была создана с использованием
ACCESS_READилиACCESS_COPY, при изменении размера карты возникнет исключениеTypeError.В Windows: Изменение размера карты приведет к появлению
OSError, если для файла с тем же именем есть другие карты. Изменение размера анонимной карты (т.е. по отношению к файлу подкачки) автоматически создаст новую карту с исходными данными, скопированными до длины нового размера.Изменено в версии 3.11: Корректный сбой при попытке изменить размер, когда удерживается другая карта, позволяет изменить размер по сравнению с анонимной картой в Windows
- rfind(sub[, start[, end]])¶
Возвращает наивысший индекс в объекте, в котором найдена подпоследовательность sub, такой, что sub содержится в диапазоне [start, end]. Необязательные аргументы start и end интерпретируются как в нотации среза. Возвращает
-1в случае сбоя.Изменено в версии 3.5: Теперь доступно для записи bytes-like object.
- seek(pos[, whence])¶
Установите текущее положение файла. аргумент where является необязательным и по умолчанию имеет значение
os.SEEK_SETили0(абсолютное расположение файла); другими значениями являютсяos.SEEK_CURили1(поиск относительно текущего положения) иos.SEEK_ENDили2(искать относительно конца файла).
- size()¶
Возвращает длину файла, которая может быть больше размера области, отображенной в памяти.
- tell()¶
Возвращает текущее положение указателя на файл.
- write(bytes)¶
Запишите байты в bytes в память в текущей позиции указателя на файл и верните количество записанных байт (никогда не меньше
len(bytes), поскольку, если запись завершится неудачей, будет поднято значениеValueError). Позиция файла обновляется до точки, следующей за записанными байтами. Если карта была создана с помощьюACCESS_READ, то при записи в нее возникнет исключениеTypeError.Изменено в версии 3.5: Теперь доступно для записи bytes-like object.
Изменено в версии 3.6: Теперь возвращается количество записанных байт.
MADV_* Константы¶
- mmap.MADV_NORMAL¶
- mmap.MADV_RANDOM¶
- mmap.MADV_SEQUENTIAL¶
- mmap.MADV_WILLNEED¶
- mmap.MADV_DONTNEED¶
- mmap.MADV_REMOVE¶
- mmap.MADV_DONTFORK¶
- mmap.MADV_DOFORK¶
- mmap.MADV_HWPOISON¶
- mmap.MADV_MERGEABLE¶
- mmap.MADV_UNMERGEABLE¶
- mmap.MADV_SOFT_OFFLINE¶
- mmap.MADV_HUGEPAGE¶
- mmap.MADV_NOHUGEPAGE¶
- mmap.MADV_DONTDUMP¶
- mmap.MADV_DODUMP¶
- mmap.MADV_FREE¶
- mmap.MADV_NOSYNC¶
- mmap.MADV_AUTOSYNC¶
- mmap.MADV_NOCORE¶
- mmap.MADV_CORE¶
- mmap.MADV_PROTECT¶
- mmap.MADV_FREE_REUSABLE¶
- mmap.MADV_FREE_REUSE¶
Эти параметры могут быть переданы в
mmap.madvise(). Не все параметры будут присутствовать в каждой системе.Доступность: Системы с системным вызовом madvise().
Добавлено в версии 3.8.
MAP_* Константы¶
- mmap.MAP_SHARED¶
- mmap.MAP_PRIVATE¶
- mmap.MAP_DENYWRITE¶
- mmap.MAP_EXECUTABLE¶
- mmap.MAP_ANON¶
- mmap.MAP_ANONYMOUS¶
- mmap.MAP_POPULATE¶
- mmap.MAP_STACK¶
Это различные флаги, которые могут быть переданы в
mmap.mmap(). Обратите внимание, что в некоторых системах некоторые опции могут отсутствовать.Изменено в версии 3.10: Добавлена константа MAP_POPULATE.
Добавлено в версии 3.11: Добавлена константа MAP_STACK.