mmap — Memory-mapped file support


Файлові об’єкти, відображені в пам’яті, поводяться як 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 or None, the mapping is created without a name. Avoiding the use of the tag 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 specifies the nature of the mapping. MAP_PRIVATE creates a private copy-on-write mapping, so changes to the contents of the mmap object will be private to this process, and MAP_SHARED creates a mapping that’s shared with all other processes mapping the same areas of the file. The default value is MAP_SHARED.

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.

To ensure validity of the created memory mapping the file specified by the descriptor fileno is internally automatically synchronized with physical backing store on macOS and OpenVMS.

У цьому прикладі показано простий спосіб використання 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 or ACCESS_COPY, resizing the map will raise a TypeError exception.

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: Додано повернення кількості записаних байтів.

write_byte(byte)

Записує ціле byte у пам’ять у поточній позиції покажчика файлу; позиція файлу просувається вперед на 1. Якщо mmap було створено за допомогою ACCESS_READ, то запис у нього призведе до виключення TypeError.

Константи 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.madvise(). Не кожен параметр буде присутній у кожній системі.

Доступність: системи з системним викликом madvise().

Нове в версії 3.8.