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 個位元組的位置。

更新於: 2021年1月12日

1K+ 瀏覽量

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告