1,1K подписчиков

Программирование на Python. Модуль mmap, прямое отображение в память

Доброго времени суток, читатели, зрители моего канала programmer's notes. Не забывайте подписываться и писать свои комментарии к моим статьям и видео.

Прямое отображение в памяти в программах на python с использованием модуля mmap

Честно говоря упустил эту технологию, даже не подумал про неё в отношении Python. Хотя пользовался возможностями mmap на C и ассемблере. Но там просто системные функции используются. А оказывается в Python есть такой модуль и можно использовать её в своих целях.

И так о чём же идёт речь. Это файлы отображаемые в память. Эта технология есть и в Unix-подобных системах и в Windows. Что даёт эта технология:

  1. Быстроту работы с файлом, поскольку он в памяти.
  2. Возможность работы с файлами любого размера. Если не хватает физической памяти, подключается виртуальная.
  3. Разделяемую память, т.е. даёт возможность доступа к файлу нескольких процессов.

После закрытия отображённого файла, если он редактировался, он перезаписывается на диск.

Будет несколько статей по теме mmap в Python.

В общем случае методы объектов mmap работают с байтовыми последовательностями в памяти. Сегодня рассмотрим пример работы с текстовым файлом. Здесь приходится учитывать кодировку. В программе ниже (рисунок 1) открывается текстовый файл и вставляются в его начало пять пробелов.

Рисунок. 1. Пример использования модуля mmap. Текст программы  см. по ссылке внизу
Рисунок. 1. Пример использования модуля mmap. Текст программы см. по ссылке внизу

Прокомментируем программу из рисунка 1.

  • Для того, чтобы отобразить файл в памяти, необходимо в начале открыть файл обычным образом (open).
  • Параметр length связан с длиной файла. Если length=0 то длина отображаемого файла устанавливается как длина файла на диске. Если length будет больше длины файла, то мы получим файла большей длины. После закрытия длина файла на диске также увеличиться.
  • Параметр access определяет форму доступа к отображенному файлу, принимает значения mmap.ACCESS_READ - только для чтение, mmap.ACCESS_WRITE - возможна запись и чтения, mmap.ACCESS_COPY - изменение отображенного файла без записи его на диск, mmap.ACCESS_DEFAULT - соответствует значению по умолчанию.
  • Можно получить длину отображённого файла: mmap.size(), изменить длину файл mmap.resize().
  • Особенностью работы с текстовыми файлами является то, что объект mmap работает с байтами, а кодирование одного символа может потребовать нескольких байтов. Поэтому работая с текстовыми файлами нет смысла читать часть файла и что-то делать с этим. Или работать с отдельными байтами. Есть смысл прочесть весь файл и перекодировать результат с помощью метода decode(). Получим, таким образом строку. Поработав с ней, нужно произвести обратную перекодировку encode() и записать результат в отображённый файл.
  • Наконец, метод mmap.seek() переводит указатель в заданную позицию. В программе он ставится в начале отображённого файла.

Ниже (рисунок 2) я просто переписал программу из рисунка 1 с использованием оператора with.

Рисунок 2. Пример использования модуля mmap (оператор with). Текст программы  см. по ссылке внизу
Рисунок 2. Пример использования модуля mmap (оператор with). Текст программы см. по ссылке внизу

Я продолжу рассматривать модуль mmap в следующей статье. В частности рассмотрю использование его в многозадачности.

Замечание 1
Следует иметь в виду, что нельзя отображать в памяти файлы, длина которых равна 0. Так что, если решили использовать данный механизм, то как минимум файл должен быть не пустым.

Замечание 2
При работе с файлами, отображаемыми в память нужно понять, что область только перезаписывается, но не раздвигается. Чтобы раздвинуть область нужно заранее увеличить её длину, в противном случае произойдёт ошибка попытки записи вне зарезервированной памяти.

Замечание 3
Для работы с текстовой информацией приходится считывать её в переменную, а потом перезаписывать. Однако здесь таится одна угроза. Символы в тексте могут кодироваться двумя и более байтами. В таких случаях приходится считывать весь текст в переменную, перекодировать в строку, производить действия, сделать обратную перекодировку, при необходимости изменить область размер области данных и записать в память.

Ну, пока всё!

Пишите свои предложения и замечания, и занимайтесь программированием, а также проектированием баз данных, хотя бы для поддержания уровня интеллекта.

Что-то с памятью моей стало, видимо не то в неё отобразил
Что-то с памятью моей стало, видимо не то в неё отобразил