# `mmap` — Memory-mapped file support

Availability: not WASI.

This module does not work or is not available on WebAssembly. 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=0)

  (Версія для 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 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=0, *, trackfd=True)

  (версія 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.

  If trackfd is `False`, the file descriptor specified by fileno will not be duplicated, and the resulting `mmap` object will not be associated with the map’s underlying file. This means that the `size()` and `resize()` methods will fail. This mode is useful to limit the number of open file descriptors.

  Щоб забезпечити дійсність створеного відображення пам’яті, файл, указаний дескриптором fileno, внутрішньо автоматично синхронізується з фізичним резервним сховищем у macOS.

  Змінено в версії 3.13: The trackfd parameter was added.

  У цьому прикладі показано простий спосіб використання `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!")

  Added in version 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`, якщо файл закрито.

    Added in version 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()`.

    Added in version 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.

    Resizing a map created with access of `ACCESS_READ` or `ACCESS_COPY`, will raise a `TypeError` exception. Resizing a map created with with trackfd set to `False`, will raise a `ValueError` 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` (пошук відносно кінця файлу).

    Змінено в версії 3.13: Return the new absolute position instead of `None`.

  seekable()

    Return whether the file supports seeking, and the return value is always `True`.

    Added in version 3.13.

  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.MADV_FREE_REUSABLE
mmap.MADV_FREE_REUSE

  Ці параметри можна передати в `mmap.madvise()`. Не кожен параметр буде присутній у кожній системі.

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

  Added in version 3.8.

## Константи MAP_*

mmap.MAP_SHARED
mmap.MAP_PRIVATE
mmap.MAP_32BIT
mmap.MAP_ALIGNED_SUPER
mmap.MAP_ANON
mmap.MAP_ANONYMOUS
mmap.MAP_CONCEAL
mmap.MAP_DENYWRITE
mmap.MAP_EXECUTABLE
mmap.MAP_HASSEMAPHORE
mmap.MAP_JIT
mmap.MAP_NOCACHE
mmap.MAP_NOEXTEND
mmap.MAP_NORESERVE
mmap.MAP_POPULATE
mmap.MAP_RESILIENT_CODESIGN
mmap.MAP_RESILIENT_MEDIA
mmap.MAP_STACK
mmap.MAP_TPRO
mmap.MAP_TRANSLATED_ALLOW_EXECUTE
mmap.MAP_UNIX03

  These are the various flags that can be passed to `mmap.mmap()`. `MAP_ALIGNED_SUPER` is only available at FreeBSD and `MAP_CONCEAL` is only available at OpenBSD. Note that some options might not be present on some systems.

  Змінено в версії 3.10: Added `MAP_POPULATE` constant.

  Added in version 3.11: Added `MAP_STACK` constant.

  Added in version 3.12: Added `MAP_ALIGNED_SUPER` and `MAP_CONCEAL` constants.

  Added in version 3.13: Added `MAP_32BIT`, `MAP_HASSEMAPHORE`, `MAP_JIT`, `MAP_NOCACHE`, `MAP_NOEXTEND`, `MAP_NORESERVE`, `MAP_RESILIENT_CODESIGN`, `MAP_RESILIENT_MEDIA`, `MAP_TPRO`, `MAP_TRANSLATED_ALLOW_EXECUTE`, and `MAP_UNIX03` constants.