# `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 визначає характер відображення. `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` 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.``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`

  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.