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.