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