Python (mmap) 中的内存映射文件支持?

当你将一个文件对象读到一个python程序中并想要修改时,可以通过两种方式来完成。第一种方式是修改文件所在物理存储驱动器中的内容,第二种方式是直接在系统的内存或Ram中进行修改。在本文中,我们将看到如何使用 Python 中可用的 mmap 模块读取、搜索和修改文件对象的内容。内存映射不是通过系统调用(例如 open、read 和 lseek)来操作文件,而是将文件的数据放入内存中,从而允许您直接操作内存中的文件。

读取内存映射文件

在下面的例子中,我们一次将一个完整的文件读入内存,并将其作为文件对象保存在内存中。然后我们以读取模式访问它。最后,如您所见,整个文件代表一个对象,我们从中切片某些位置以获得所需的文本。

例子

import mmap

def read_mmap(fname):
   with open(fname, mode="r", encoding="utf8") as fobj:
      with mmap.mmap(fobj.fileno(), length=0, access=mmap.ACCESS_READ) as mmap_obj:
         print(mmap_obj[4:26])

read_mmap('E:\\test.txt')

输出

运行上面的代码给我们以下结果 -

'emissions from gaseous'

使用 mmap 查找

例子

import mmap
import time

def regular_io_find(fname):
   with open(fname, mode="r", encoding="utf-8") as fobj:
      text = fobj.read()
      text.find("Death ")

def mmap_io_find(fname):
   with open(fname, mode="r", encoding="utf-8") as fobj:
      with mmap.mmap(fobj.fileno(), length=0, access=mmap.ACCESS_READ) as mmap_obj:
         mmap_obj.find(b"Death ")

start_time_r = time.time()
regular_io_find('E:\\emissions.txt')
end_time_r = time.time()
print("Regualr read start time :",start_time_r)
print("Regualr read start time :",end_time_r)
print('Regular read time : {0}'.format(end_time_r - start_time_r))

start_time_m = time.time()
mmap_io_find('E:\\emissions.txt')
end_time_m = time.time()
print("mmap read start time :",start_time_m)
print("mmap read start time :",end_time_m)
print('mmap read time : {0}'.format(end_time_m - start_time_m))

输出

运行上面的代码给我们以下结果 -

2013
Regualr read start time : 1609812463.2718163
Regualr read end time : 1609812463.2783241
Regular read time to find: 0.00650787353515625
mmap read start time : 1609812463.2783241
mmap read start time : 1609812463.2783241
mmap read time to find : 0.0

写入文件

在下面的示例中,我们获取一个文件并使用 mmap 模块打开它,访问代码为 r+ 允许读取和写入文件。创建文件对象后,我们通过切片来选择可以写入字符串的位置。

例子

import mmap

def mmap_io_write(fname):
   with open(fname, mode="r+") as fobj:
      with mmap.mmap(fobj.fileno(), length=0, access=mmap.ACCESS_WRITE) as mmap_obj:
         mmap_obj[20:26] = b"Hello!"
         mmap_obj.flush()

mmap_io_write('E:\\emissions.txt')

在运行上面的代码时,我们可以打开文件并看到字符串 Hello! 写入文件的字节位置为 20 到 26。