เมื่อคุณอ่านไฟล์อ็อบเจ็กต์ไปยังโปรแกรม 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