Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

รองรับไฟล์ที่แมปหน่วยความจำใน Python (mmap) หรือไม่


เมื่อคุณอ่านไฟล์อ็อบเจ็กต์ไปยังโปรแกรม python และต้องการแก้ไข สามารถทำได้สองวิธี วิธีแรกคือการแก้ไขเนื้อหาในไดรฟ์จัดเก็บจริงที่มีไฟล์อยู่ และวิธีที่สองคือการแก้ไขโดยตรงในหน่วยความจำหรือ RAM ของระบบ ในบทความนี้ เราจะมาดูวิธีการอ่าน ค้นหา และแก้ไขเนื้อหาของวัตถุไฟล์โดยใช้โมดูล mmap ที่มีอยู่ใน python แทนที่จะเรียกใช้ระบบ เช่น เปิด อ่าน และพยายามจัดการไฟล์ การแมปหน่วยความจำจะใส่ข้อมูลของไฟล์ลงในหน่วยความจำ ซึ่งช่วยให้คุณจัดการไฟล์ในหน่วยความจำได้โดยตรง

อ่านไฟล์ที่แมปหน่วยความจำ

ในตัวอย่างด้านล่าง เราอ่านไฟล์ทั้งหมดลงในหน่วยความจำพร้อมกันและเก็บไว้ในหน่วยความจำเป็นวัตถุไฟล์ จากนั้นเราเข้าถึงได้ในโหมดอ่าน สุดท้ายนี้ คุณจะเห็นได้ว่าไฟล์ทั้งหมดแสดงถึงวัตถุที่เราแบ่งตำแหน่งบางตำแหน่งเพื่อให้ได้ข้อความที่ต้องการ

ตัวอย่าง

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