mmap
— Memory-mapped file support¶
Availability: not Emscripten, not WASI.
This module does not work or is not available on WebAssembly platforms
wasm32-emscripten
and wasm32-wasi
. See
WebAssembly platforms for more information.
Файлові об’єкти, відображені в пам’яті, поводяться як bytearray
і як файлові об’єкти. Ви можете використовувати об’єкти mmap у більшості місць, де очікується bytearray
; наприклад, ви можете використовувати модуль re
для пошуку у файлі, відображеному в пам’яті. Ви також можете змінити один байт, виконавши obj[index] = 97
, або змінити підпослідовність, призначивши зрізу: obj[i1:i2] = b'...'
. Ви також можете читати та записувати дані, починаючи з поточної позиції файлу, і seek()
по файлу до різних позицій.
A memory-mapped file is created by the mmap
constructor, which is
different on Unix and on Windows. In either case you must provide a file
descriptor for a file opened for update. If you wish to map an existing Python
file object, use its fileno()
method to obtain the correct value for the
fileno parameter. Otherwise, you can open the file using the
os.open()
function, which returns a file descriptor directly (the file
still needs to be closed when done).
Примітка
Якщо ви хочете створити відображення пам’яті для змінюваного буферизованого файлу, вам слід спочатку зробити для файлу flush()
. Це необхідно для того, щоб локальні модифікації буферів фактично були доступні для відображення.
Для версій конструктора як для Unix, так і для Windows, access можна вказати як необов’язковий keyword параметр. 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 слід передати як fileno разом із довжиною.
- class mmap.mmap(fileno, length, tagname=None, access=ACCESS_DEFAULT[, offset])¶
(Версія для Windows) Відображає length байт з файлу, указаного дескриптором файлу fileno, і створює об’єкт mmap. Якщо length більший за поточний розмір файлу, файл розширюється, щоб містити length байтів. Якщо length дорівнює
0
, максимальна довжина мапінгу дорівнює поточному розміру файлу, за винятком коли файл порожній - тоді Windows стригерує виключення (ви не можете створити порожній мапінг у Windows).tagname, if specified and not
None
, is a string giving a tag name for the mapping. Windows allows you to have many different mappings against the same file. If you specify the name of an existing tag, that tag is opened, otherwise a new tag of this name is created. If this parameter is omitted orNone
, the mapping is created without a name. Avoiding the use of the tagname parameter will assist in keeping your code portable between Unix and Windows.offset можна вказати як невід’ємне ціле зміщення. посилання mmap будуть відносними до зміщення від початку файлу. offset за умовчанням дорівнює 0. offset має бути кратним
ALLOCATIONGRANULARITY
.Викликає подію аудиту
mmap.__new__
з аргументамиfileno
,length
,access
,offset
.
- class mmap.mmap(fileno, length, flags=MAP_SHARED, prot=PROT_WRITE|PROT_READ, access=ACCESS_DEFAULT[, offset])
(версія Unix) Відображає length байтів з файлу, указаного дескриптором файлу fileno, і повертає об’єкт mmap. Якщо length дорівнює
0
, максимальна довжина відображення(мапінгу) буде поточним розміром файлу під час викликуmmap
.flags визначає характер відображення.
MAP_PRIVATE
створює приватне відображення(мапінг), що копіюється під час запису, тому зміни до вмісту об’єкта mmap будуть приватними для цього процесу, аMAP_SHARED
створює відображення, яке використовується спільно з усіма іншими процесами, що відображають однакові області файлу. Значення за замовчуванням:MAP_SHARED
. Деякі системи мають додаткові можливі прапорці з повним списком, указаним у константах MAP_*.prot, якщо вказано, надає бажаний захист пам’яті; двома найбільш корисними значеннями є
PROT_READ
іPROT_WRITE
, щоб вказати, що сторінки можна читати або записувати. prot за замовчуваннямPROT_READ | PROT_WRITE
.access можна вказати замість flags і prot як необов’язковий keyword параметр. Є помилкою вказувати одночасно flags, prot і access. Перегляньте опис access вище, щоб дізнатися, як використовувати цей параметр.
offset можна вказати як невід’ємне ціле зміщення. посилання 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()
Викликає подію аудиту
mmap.__new__
з аргументамиfileno
,length
,access
,offset
.Файлові об’єкти, відображені в пам’яті, підтримують такі методи:
- close()¶
Закриває mmap. Подальші виклики інших методів об’єкта призведуть до виникнення винятку ValueError. Це не закриє відкритий файл.
- closed¶
True
, якщо файл закрито.Нове в версії 3.2.
- find(sub[, start[, end]])¶
Повертає найменший індекс в об’єкті, де знайдено підпослідовність sub, так що sub міститься в діапазоні [start, end]. Необов’язкові аргументи start і end інтерпретуються як у slice нотації (нотації зрізів). Повертає
-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 і має довжину length. option має бути однією з констант MADV_*, доступних у системі. Якщо start і end опущені, охоплюється все відображення. У деяких системах (включаючи Linux) start має бути кратним
PAGESIZE
.Доступність: системи з системним викликом
madvise()
.Нове в версії 3.8.
- move(dest, src, count)¶
Копіювання count байтів, починаючи із зміщення src, до індексу призначення dest. Якщо mmap було створено за допомогою
ACCESS_READ
, тоді виклик переміщення призведе до виняткуTypeError
.
- read([n])¶
Повертає
bytes
, що містить до n байтів, починаючи з поточної позиції файлу. Якщо аргумент пропущений,None
або негативний, повертаються всі байти від поточної позиції файлу до кінця відображення. Позиція файлу оновлюється, щоб вказувати одразу після байтів, які були повернуті.Змінено в версії 3.3: Аргумент можна опустити або бути
None
.
- read_byte()¶
Повертає байт у поточній позиції файлу як ціле число integer та переміщує позицію у файлі на 1.
- readline()¶
Повертає один рядок, починаючи з поточної позиції файлу й до наступного нового рядка. Позиція файлу оновлюється, щоб вказувати після байтів, які були повернуті.
- resize(newsize)¶
Resizes the map and the underlying file, if any. If the mmap was created with
ACCESS_READ
orACCESS_COPY
, resizing the map will raise aTypeError
exception.On Windows: Resizing the map will raise an
OSError
if there are other maps against the same named file. Resizing an anonymous map (ie against the pagefile) will silently create a new map with the original data copied over up to the length of the new size.Змінено в версії 3.11: Correctly fails if attempting to resize when another map is held Allows resize against an anonymous map on Windows
- rfind(sub[, start[, end]])¶
Повертає останній індекс в об’єкті, де знайдено підпослідовність sub, так що sub міститься в діапазоні [start, end]. Необов’язкові аргументи start та end інтерпретуються як у нотації зрізів (slice нотація). Повертає
-1
у разі помилки.Змінено в версії 3.5: Записуваний bytes-like object тепер приймається.
- seek(pos[, whence])¶
Встановлює поточну позицію в файлі. Аргумент whence є необов’язковим і за замовчуванням має значення
os.SEEK_SET
або0
(абсолютне розташування файлу); іншими значеннями єos.SEEK_CUR
або1
(пошук відносно поточної позиції) іos.SEEK_END
або2
(пошук відносно кінця файлу).
- size()¶
Повертає довжину файлу, яка може перевищувати розмір відображеної області пам’яті.
- tell()¶
Повертає поточну позицію покажчика файлу.
- write(bytes)¶
Записує байти в bytes у пам’ять у поточній позиції вказівника файлу та повертає кількість записаних байтів (ніколи не менше ніж
len(bytes)
, але якщо запис не вдається то це призведе до виняткуValueError
). Позиція файлу оновлюється, щоб вказувати після записаних байтів. Якщо mmap було створено за допомогою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¶
These are the various flags that can be passed to
mmap.mmap()
. Note that some options might not be present on some systems.Змінено в версії 3.10: Added MAP_POPULATE constant.
Нове в версії 3.11: Added MAP_STACK constant.