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

Функция mmap в Python – Краткий справочник

Есть много способов ввода-вывода файлов в Python, и mmap-самый крутой, но редко используемый метод для того же самого. В этом уроке мы изучим функцию mmap в

Автор оригинала: Pankaj Kumar.

Есть много способов ввода-вывода файлов в Python, и mmap-самый крутой, но редко используемый метод для того же самого. В этом уроке мы изучим функцию mmap в Python, а также узнаем о сопоставлении памяти, которое лежит в основе концепции функции mmap.

Что такое отображение памяти?

Сопоставление памяти-это процесс, с помощью которого конструкции машинного уровня используются для сопоставления файла непосредственно для использования в программе с диска. Он сопоставляет весь файл на диске с диапазоном адресов в адресном пространстве компьютерной программы. Программа может получить доступ к файлам на диске таким же образом, как и к данным из оперативной памяти.

Управление памятью в компьютере

Чтобы четко понять процесс, лежащий в основе отображения памяти и работы mmap, давайте кратко разберемся в типах компьютерной памяти.

  • Физическая память : Это оперативная память(ОЗУ) и энергонезависимая память. Он доступен программам, пока они активны.
  • Виртуальная память : Если у нас есть 64-разрядная машина, мы можем получить доступ к 17 миллиардам гигабайт данных. Но на самом деле наша физическая память составляет максимум 8 или 16 гигабайт в персональных компьютерах. Компьютер сопоставляет физическую память со своим виртуальным пространством и использует часть диска хранения, называемую пространством подкачки, чтобы компенсировать меньшее количество памяти, если мы запускаем большие программы, и нам не нужно беспокоиться о размере файла, даже если он слишком большой. Различные методы подкачки используются для обмена данными с диска в память во время использования.
  • Общая память : С помощью таких методов, как подкачка и виртуальная память, несколько программ могут работать одновременно, используя одну физическую память, даже если ее емкость невелика. Данные, которые не используются, отправляются в память подкачки, а данные, которые должны использоваться, копируются в основную память, таким образом, все программы работают.

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

Но на самом деле файл присутствует только на диске. Операционная система просто отображает адрес файла в адресное пространство программы, чтобы программа могла получить доступ к файлу.

Как использовать функцию mmap в Python?

Мы можем использовать модуль mmap для ввода-вывода файлов вместо простой работы с файлами. Давайте разберемся, как использовать mmap, с помощью следующего примера.

#import module
import mmap

#define filepath
filepath="/home/aditya1117/askpython/sample.txt"

#create file object using open function call
file_object= open(filepath,mode="r",encoding="utf8")

#create an mmap object using mmap function call
mmap_object= mmap.mmap(file_object.fileno(),length=0,access=mmap.ACCESS_READ,offset=0)

#read data from mmap object
txt=mmap_object.read()

#print the data
print("Data read from file in byte format is:")
print(txt)
print("Text data is:")
print(txt.decode())

Выход:

Data read from file in byte format is:
b'This is a sample file for mmap tutorial.\n'
Text data is:
This is a sample file for mmap tutorial.

В приведенном выше примере,

  1. сначала мы импортируем модуль mmap
  2. затем определите путь к файлу на диске
  3. затем мы создаем объект file_object с помощью системного вызова open()
  4. После получения объекта file мы создаем отображение файла в адресное пространство программы с помощью функции mmap
  5. Затем мы считываем данные из объекта mmap
  6. и распечатайте данные.

Описание функции mmap

mmap_object= mmap.mmap(file_object.fileno(),length=0,access=mmap.ACCESS_READ,offset=0)

для mmap требуется файловый дескриптор для первого аргумента.

Аргумент length принимает размер отображаемой памяти в байтах, а аргумент access информирует ядро о том, как программа собирается получить доступ к памяти.

Аргумент offset указывает программе создать карту памяти файла после определенных байтов, указанных в смещении.

  • Дескриптор файла для первого аргумента предоставляется методом fileno() объекта file.
  • length во втором аргументе может быть указано 0, если мы хотим, чтобы система автоматически выбирала достаточный объем памяти для отображения файла.
  • Аргумент доступа имеет множество вариантов. ACCESS_READ позволяет пользовательской программе читать только из сопоставленной памяти. ACCESS_COPY и ACCESS_WRITE предлагают доступ в режиме записи. В режиме ACCESS_WRITE программа может изменять как сопоставленную память, так и файл, но в режиме ACCESS_COPY изменяется только сопоставленная память.
  • Аргумент смещения часто указывается 0, когда мы хотим сопоставить файл с начальным адресом.

Как записать данные в файл, сопоставленный с памятью?

Чтобы записать некоторые данные в файл, сопоставленный с памятью, мы можем использовать параметр ACCESS_WRITE в аргументе access и использовать функцию mmap_object.write() для записи в файл после создания объекта file, открыв файл в режиме r+ .

Здесь мы должны позаботиться о том, что mmap не позволяет сопоставлять пустые файлы. Это связано с тем, что для пустого файла не требуется сопоставление памяти, потому что это просто буфер памяти.

Если мы откроем файл в режиме “w”, mmap вызовет ошибку ValueError.

#import module
import mmap

#define filepath
filepath="/home/aditya1117/askpython/sampleoutput.txt"

#create file object using open function call
file_object= open(filepath,mode="r+",encoding="utf8")
print("Initial data in the file is:")
print(file_object.read())

#create an mmap object using mmap function call
mmap_object= mmap.mmap(file_object.fileno(),length=0,access=mmap.ACCESS_WRITE,offset=0 )

#write something into file
text="Aditya is writing this text to file  "
mmap_object.write(bytes(text,encoding="utf8"))

# read data from file 
nfile_object= open(filepath,mode="r+",encoding="utf8")

print("Modified data from file is:")
print(nfile_object.read())

Выход:

Initial data in the file is:
This is a sample file for mmap tutorial in python.

Modified data from file is:
Aditya is writing this text to file  al in python.

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

Кроме того, map начинает запись данных с первого адреса файла и перезаписывает исходные данные. Если нам нужно сохранить предыдущие данные, мы можем сделать это, указав соответствующее смещение в вызове функции mmap.

Как получить доступ к определенной части файла с помощью mmap?

Мы можем получить доступ к части файла непосредственно с помощью объектов карты. объекты карты можно нарезать, как мы используем нарезку в списках python.

объекты mmap показывают поведение строк, и многие операции, выполняемые со строками, могут быть применены к объектам mmap.

объекты mmap можно нарезать, как мы используем нарезку в списках Python . Предположим, мы хотим прочитать от 10-го до 99-го символа файла. Мы можем сделать это, как показано в следующем примере.

#import module
import mmap

#define filepath
filepath="/home/aditya1117/askpython/sample.txt"

#create file object using open function call
file_object= open(filepath,mode="r",encoding="utf8")

#create an mmap object using mmap function call
mmap_object= mmap.mmap(file_object.fileno(),length=0,access=mmap.ACCESS_READ,offset=0 )
print("Complete data in byte format is:")
print(mmap_object.read())
print("Data from 9th to 97th character is:")
#print 10th to 99th character
print(mmap_object[9:98])

Выход:

Complete data in byte format is:
b'We can access a part of file directly using mmap objects. mmap objects can be sliced as we use slicing on python lists.mmap objects show the behavior of strings and many operations which are done on strings can be applied to mmap objects.mmap objects can be sliced as we use lists in python. Suppose we want to read from the 10th to 99th character of the file. We can do so as shown in the following example.\n'
Data from 9th to 97th character is:
b'cess a part of file directly using mmap objects. mmap objects can be sliced as we use sli'

Зачем использовать mmap в Python?

Простые операции чтения/записи делают много системных вызовов во время выполнения, что приводит к многократному копированию данных в разных буферах в процессе.

Использование mmap обеспечивает нам значительное улучшение производительности, поскольку оно пропускает вызовы функций и буферизует операции, особенно в программах, где требуется обширный ввод-вывод файлов.

Вывод

В этом уроке, во-первых, мы увидели, что такое отображение памяти. Затем мы рассмотрели методы управления памятью. Затем мы увидели, как использовать mmap в Python, используя различные примеры, а также увидели некоторые технические аспекты работы функции. Счастливого Обучения!