บทนำ
mmap (Memory-mapped file) แมปไฟล์เข้าหน่วยความจำ เข้าถึง/แก้ไขไฟล์เหมือน byte array ใน RAM เร็วกว่าการอ่าน/เขียนไฟล์ปกติสำหรับไฟล์ขนาดใหญ่
1. อ่านไฟล์ด้วย mmap
import mmap
def read_mmap(filename):
with open(filename, "r", encoding="utf-8") as f:
with mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ) as mm:
print(mm[4:26]) # อ่าน byte 4-25
print(mm.readline()) # อ่านบรรทัด
print(mm.find(b"keyword")) # ค้นหา
2. เขียนไฟล์ด้วย mmap
def write_mmap(filename):
with open(filename, "r+") as f:
with mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_WRITE) as mm:
mm[20:26] = b"Hello!" # เขียนทับ byte 20-25
mm.flush() # บังคับเขียนลงดิสก์
3. เปรียบเทียบประสิทธิภาพ: mmap vs Regular I/O
import time
def regular_find(filename, keyword):
with open(filename, "r") as f:
return f.read().find(keyword)
def mmap_find(filename, keyword):
with open(filename, "r") as f:
with mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ) as mm:
return mm.find(keyword.encode())
# ทดสอบกับไฟล์ขนาดใหญ่
# mmap เร็วกว่ามากสำหรับการค้นหา/อ่านแบบสุ่ม
Access Modes
| Mode | คำอธิบาย |
|---|---|
| ACCESS_READ | อ่านอย่างเดียว |
| ACCESS_WRITE | อ่าน/เขียน (เปลี่ยนแปลงลงดิสก์) |
| ACCESS_COPY | อ่าน/เขียนในหน่วยความจำอย่างเดียว (ไม่บันทึกลงดิสก์) |
ข้อควรระวัง
- ไฟล์ต้องมีอยู่แล้ว (mmap ไม่สร้างไฟล์ใหม่)
- บน Windows: ไม่สามารถ mmap ไฟล์เปิดอยู่ที่อื่นได้
- ใช้
flush()เพื่อให้แน่ใจว่าเขียนลงดิสก์แล้ว