Computer >> Máy Tính >  >> Lập trình >> Python

Hỗ trợ tệp ánh xạ bộ nhớ bằng Python (mmap)?

Khi bạn đọc một đối tượng tệp cho một chương trình python và muốn sửa đổi, nó có thể được thực hiện theo hai cách. Cách thứ nhất là sửa đổi nội dung trong ổ lưu trữ vật lý nơi chứa tập tin và cách thứ hai là sửa đổi trực tiếp trong bộ nhớ hoặc Ram của hệ thống. Trong bài viết này, chúng ta sẽ xem cách đọc, tìm kiếm và sửa đổi nội dung của một đối tượng tệp bằng cách sử dụng mô-đun mmap có sẵn trong python. Thay vì thực hiện các lệnh gọi hệ thống như mở, đọc và lseek để thao tác tệp, ánh xạ bộ nhớ đưa dữ liệu của tệp vào bộ nhớ cho phép bạn thao tác trực tiếp với tệp trong bộ nhớ.

Đọc tệp được ánh xạ bộ nhớ

Trong ví dụ dưới đây, chúng tôi đọc một tệp hoàn chỉnh vào bộ nhớ cùng một lúc và giữ nó trong bộ nhớ dưới dạng một đối tượng tệp. Sau đó, chúng tôi truy cập nó ở chế độ đọc. Cuối cùng, như bạn có thể thấy toàn bộ tệp đại diện cho một đối tượng mà từ đó chúng tôi cắt các vị trí nhất định để có được văn bản cần thiết.

Ví dụ

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')

Đầu ra

Chạy đoạn mã trên cho chúng ta kết quả sau -

'emissions from gaseous'

Tìm bằng mmap

Ví dụ

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))

Đầu ra

Chạy đoạn mã trên cho chúng ta kết quả sau -

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

Ghi vào tệp

Trong ví dụ dưới đây, chúng tôi lấy một tệp và mở nó bằng mô-đun mmap với mã truy cập là r +, cho phép cả đọc và ghi vào tệp. Sau khi tạo đối tượng tệp, chúng tôi chọn một vị trí bằng cách cắt nơi chúng tôi có thể viết một chuỗi.

Ví dụ

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')

Khi chạy đoạn mã trên, chúng ta có thể mở tệp và thấy chuỗi Xin chào! Được ghi vào tệp ở vị trí byte từ 20 đến 26.