Доброго времени суток, читатели, зрители моего канала programmer's notes. Не забывайте подписываться и писать свои комментарии к моим статьям и видео.
Прямое отображение в памяти в программах на python с использованием модуля mmap
Честно говоря упустил эту технологию, даже не подумал про неё в отношении Python. Хотя пользовался возможностями mmap на C и ассемблере. Но там просто системные функции используются. А оказывается в Python есть такой модуль и можно использовать её в своих целях.
И так о чём же идёт речь. Это файлы отображаемые в память. Эта технология есть и в Unix-подобных системах и в Windows. Что даёт эта технология:
- Быстроту работы с файлом, поскольку он в памяти.
- Возможность работы с файлами любого размера. Если не хватает физической памяти, подключается виртуальная.
- Разделяемую память, т.е. даёт возможность доступа к файлу нескольких процессов.
После закрытия отображённого файла, если он редактировался, он перезаписывается на диск.
Будет несколько статей по теме mmap в Python.
В общем случае методы объектов mmap работают с байтовыми последовательностями в памяти. Сегодня рассмотрим пример работы с текстовым файлом. Здесь приходится учитывать кодировку. В программе ниже (рисунок 1) открывается текстовый файл и вставляются в его начало пять пробелов.
Прокомментируем программу из рисунка 1.
- Параметр 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.
Я продолжу рассматривать модуль mmap в следующей статье. В частности рассмотрю использование его в многозадачности.
Замечание 1
Следует иметь в виду, что нельзя отображать в памяти файлы, длина которых равна 0. Так что, если решили использовать данный механизм, то как минимум файл должен быть не пустым.
Замечание 2
При работе с файлами, отображаемыми в память нужно понять, что область только перезаписывается, но не раздвигается. Чтобы раздвинуть область нужно заранее увеличить её длину, в противном случае произойдёт ошибка попытки записи вне зарезервированной памяти.
Замечание 3
Для работы с текстовой информацией приходится считывать её в переменную, а потом перезаписывать. Однако здесь таится одна угроза. Символы в тексте могут кодироваться двумя и более байтами. В таких случаях приходится считывать весь текст в переменную, перекодировать в строку, производить действия, сделать обратную перекодировку, при необходимости изменить область размер области данных и записать в память.
Ну, пока всё!
Пишите свои предложения и замечания, и занимайтесь программированием, а также проектированием баз данных, хотя бы для поддержания уровня интеллекта.