Рубрики
Без рубрики

mmap – файлы памяти памяти

Автор оригинала: Doug Hellmann.

Цель:

Файлы mapement-map вместо того, чтобы читать содержимое напрямую.

Отображение памяти Файл использует систему виртуальной памяти операционной системы для доступа к данным в файловой системе напрямую, а не используя нормальные функции ввода/вывода. Отображение памяти обычно улучшает производительность ввода/вывода, потому что она не включает в себя отдельный системный вызов для каждого доступа, и он не требует копирования данных между буферами – память доступна непосредственно как ядро, так и пользовательским приложением.

Памятные файлы могут рассматриваться как мультипликационные строки или файловые объекты, в зависимости от необходимости. Сопоставленный файл поддерживает ожидаемые методы API файлов, такие как

Все примеры используют текстовый файл <код> lorem.txt , содержащий немного lorem ipsum. Для справки текст файла

lorem.txt.

Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
Donec egestas, enim et consectetuer ullamcorper, lectus ligula rutrum leo,
a elementum elit tortor eu quam. Duis tincidunt nisi ut ante. Nulla
facilisi. Sed tristique eros eu libero. Pellentesque vel
arcu. Vivamus purus orci, iaculis ac, suscipit sit amet, pulvinar eu,
lacus. Praesent placerat tortor sed nisl. Nunc blandit diam egestas
dui. Pellentesque habitant morbi tristique senectus et netus et
malesuada fames ac turpis egestas. Aliquam viverra fringilla
leo. Nulla feugiat augue eleifend nulla. Vivamus mauris. Vivamus sed
mauris in nibh placerat egestas. Suspendisse potenti. Mauris
massa. Ut eget velit auctor tortor blandit sollicitudin. Suspendisse
imperdiet justo.

Примечание

Существуют различия в аргументах и поведении MMAP () между UNIX и Windows, которые здесь не полностью обсуждаются. Для получения более подробной информации обратитесь к стандартной библиотечной документации.

Чтение

Используйте функцию MMAP () для создания отображаемого памяти файла. Первый аргумент – это дескриптор файлов, либо из FILENO () файла Object или из OS.OPEN () . Вызывающий не отвечает за открытие файла перед вызовом MMAP () и закрывая его после того, как он больше не нужен.

Второй аргумент MMAP () – это размер в байтах для части файла на карту. Если значение равно <код> 0 , весь файл отображается. Если размер больше текущего размера файла, файл расширен.

Примечание

Windows не поддерживает создание сопоставления ноль ноль.

Дополнительный аргумент ключевых слов, <Код> Доступ , поддерживается обеими платформами. Используйте ACCEST_READ Для доступа только к чтению, <код> ACCEST_WRITE для записи (назначения памяти переходят непосредственно к файлу), либо <код> ACCEST_COPY для копирования – Напишите (назначения памяти не записаны в файл).

mmap_read.py

import mmap

with open('lorem.txt', 'r') as f:
    with mmap.mmap(f.fileno(), 0,
                   accessmmap.ACCESS_READ) as m:
        print('First 10 bytes via read :', m.read(10))
        print('First 10 bytes via slice:', m[:10])
        print('2nd   10 bytes via read :', m.read(10))

Указатель файла отслеживает последний байт, доступен через операцию среза. В этом примере указатель движется вперед 10 байтов после первого чтения. Затем он перезагружен в начало файла по операции среза и снова переместил 10 байтов на ломтике. После операции среза вызова READ () снова дает байты 11-20 в файле.

$ python3 mmap_read.py

First 10 bytes via read : b'Lorem ipsu'
First 10 bytes via slice: b'Lorem ipsu'
2nd   10 bytes via read : b'm dolor si'

Письмо

Чтобы настроить отображаемый файл памяти для получения обновлений, начните с открытия его для добавления с режимом 'R +' (не <Код> ‘W’ ) Перед отображением его. Затем используйте любой из методов API, которые изменяют данные (<код> Написать () , назначение нарезки и т. Д.).

Следующий пример использует режим доступа по умолчанию ACCEST_WRITE и присвоение среза для изменения части строки на месте.

mmap_write_slice.py

import mmap
import shutil

# Copy the example file
shutil.copyfile('lorem.txt', 'lorem_copy.txt')

word  b'consectetuer'
reversed  word[::-1]
print('Looking for    :', word)
print('Replacing with :', reversed)

with open('lorem_copy.txt', 'r+') as f:
    with mmap.mmap(f.fileno(), 0) as m:
        print('Before:\n{}'.format(m.readline().rstrip()))
        m.seek(0)  # rewind

        loc  m.find(word)
        m[loc:loc + len(word)]  reversed
        m.flush()

        m.seek(0)  # rewind
        print('After :\n{}'.format(m.readline().rstrip()))

        f.seek(0)  # rewind
        print('File  :\n{}'.format(f.readline().rstrip()))

Слово « CONSECTETER » заменяется в середине первой строки в памяти и в файле.

$ python3 mmap_write_slice.py

Looking for    : b'consectetuer'
Replacing with : b'reutetcesnoc'
Before:
b'Lorem ipsum dolor sit amet, consectetuer adipiscing elit.'
After :
b'Lorem ipsum dolor sit amet, reutetcesnoc adipiscing elit.'
File  :
Lorem ipsum dolor sit amet, reutetcesnoc adipiscing elit.

Копировать режим

Использование настройки доступа <Код> Access_Copy не записывает изменения в файл на диске.

mmap_write_copy.py

import mmap
import shutil

# Copy the example file
shutil.copyfile('lorem.txt', 'lorem_copy.txt')

word  b'consectetuer'
reversed  word[::-1]

with open('lorem_copy.txt', 'r+') as f:
    with mmap.mmap(f.fileno(), 0,
                   accessmmap.ACCESS_COPY) as m:
        print('Memory Before:\n{}'.format(
            m.readline().rstrip()))
        print('File Before  :\n{}\n'.format(
            f.readline().rstrip()))

        m.seek(0)  # rewind
        loc  m.find(word)
        m[loc:loc + len(word)]  reversed

        m.seek(0)  # rewind
        print('Memory After :\n{}'.format(
            m.readline().rstrip()))

        f.seek(0)
        print('File After   :\n{}'.format(
            f.readline().rstrip()))

Необходимо перемотать дескриптор файлов в этом примере отдельно от обработки MMAP , поскольку внутреннее состояние двух объектов поддерживается отдельно.

$ python3 mmap_write_copy.py

Memory Before:
b'Lorem ipsum dolor sit amet, consectetuer adipiscing elit.'
File Before  :
Lorem ipsum dolor sit amet, consectetuer adipiscing elit.

Memory After :
b'Lorem ipsum dolor sit amet, reutetcesnoc adipiscing elit.'
File After   :
Lorem ipsum dolor sit amet, consectetuer adipiscing elit.

Обычные выражения

Поскольку файл отображения памяти может действовать как строка, его можно использовать с другими модулями, которые работают на строках, таких как регулярные выражения. Этот пример находит все предложения с « Nulla » в них.

mmap_regex.py

import mmap
import re

pattern  re.compile(rb'(\.\W+)?([^.]?nulla[^.]*?\.)',
                     re.DOTALL | re.IGNORECASE | re.MULTILINE)

with open('lorem.txt', 'r') as f:
    with mmap.mmap(f.fileno(), 0,
                   accessmmap.ACCESS_READ) as m:
        for match in pattern.findall(m):
            print(match[1].replace(b'\n', b' '))

Поскольку шаблон включает в себя две группы, возвращаемое значение из Findall () представляет собой последовательность кортежей. Заявление PRINT выдвигает соответствующее предложение и заменяет новые пробелы, поэтому каждый результат печатает на одну строку.

$ python3 mmap_regex.py

b'Nulla facilisi.'
b'Nulla feugiat augue eleifend nulla.'

Смотрите также