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

จะปรับปรุงประสิทธิภาพการอ่านไฟล์ใน Python ด้วยฟังก์ชัน MMAP ได้อย่างไร


แนะนำตัว..

MMAP ย่อมาจากการแม็พหน่วยความจำเมื่อแม็พกับไฟล์ใช้หน่วยความจำเสมือนของระบบปฏิบัติการเพื่อเข้าถึงข้อมูลบนระบบไฟล์โดยตรง แทนที่จะเข้าถึงข้อมูลด้วยฟังก์ชัน I/O ปกติ โดยการปรับปรุงประสิทธิภาพ I/O เนื่องจากไม่จำเป็นต้องมีการเรียกระบบแยกต่างหากสำหรับการเข้าถึงแต่ละครั้ง หรือคัดลอกข้อมูลระหว่างบัฟเฟอร์

ตามจริงแล้ว สิ่งใดในหน่วยความจำ เช่น ฐานข้อมูล SQLlite เมื่อสร้างในหน่วยความจำจะมีประสิทธิภาพที่ดีกว่าเมื่อเทียบกับดิสก์

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

MMAP รองรับวิธีการมากมาย เช่น close(), flush(), read(), readline(), Seek(), tell(), write() และสามารถทำงานกับการดำเนินการ slice และแม้แต่นิพจน์ทั่วไปได้เป็นอย่างดี

ทำอย่างไร..

1. สมมติไฟล์ข้อความที่มีเนื้อหาด้านล่าง คุณสามารถรับข้อความนี้โดยใช้ Google และค้นหาข้อความตัวอย่าง คัดลอกเนื้อหาเหล่านี้ไปยังไฟล์ input.txt

Lorem ipsum dolor sit amet, causae apeirian ea his, duo cu congue prodesset. Ut epicuri invenire duo, novum ridens eu has, ในทะเล natum meliore noluisse มีคำอธิบายที่ชัดเจน ไม่มีน้ำ eirmod deterruisset, nusquam electram rationibus ad sea, สนใจอาหารและเครื่องดื่มและนั่ง Purto molestiae cu eum, ต่อ hinc periculis intellegam.

รหัส porro facete ลบ.ม. ไม่มี est veritus detraxit facilisis, sit ea clita decore essent. Ut eam laboures fuisset menandri, ex sit brute viderer eleifend, altera argumentum vel อดีต Duo at zril sensibus, eu vim ullum assentior, quando possit at his.

Te nam tempor posidonium scripserit, eam mundi reprimique dissentias ne. เทน้ำเทมปอร์ Vim te soleat ความผิดทางประชาธิปไตย Nam an diam elaboraret, quaeque dissentias มี Autem legendos dignissim ad vis, อดีตของ amet petentium reprehendunt, inermis constituam philosophia ne mel Esse noster lobortis usu ne.

Nec reque postea urbanitas ut, mea ใน nulla invidunt ocurreret Ei duo iuvaret นำคำ. Ferri nemore audire te est, mel et detracto noluisse. ฟังเพลง โหลด MP3 Nec eu habeo justo, id pro posse apeirian โวลูตแพต Mea sonet quaestio ne.

Atqui quaeque Alienum te vim. Graeco aliquip liberavisse โปร ut. Te similique Reformidans usu, te mundi aliquando ius. Meis scripta ขั้นต่ำ quo no, meis prima fabellas eu eam, laoreet delicata forensibus ut vim Et quo vocibus ปานกลาง, atqui summo an eam.

2. เราจะใช้ฟังก์ชัน mmap() เพื่อสร้างไฟล์ที่แมปหน่วยความจำ เราสามารถส่งชื่อไฟล์ด้วยวิธี fileno() ของ file object หรือจาก os.open()

หมายเหตุ:ผู้ใช้มีหน้าที่เปิดไฟล์ก่อนเรียกใช้ mmap() และปิดไฟล์นั้น

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

import mmap

input_text = """Lorem ipsum dolor sit amet, causae apeirian ea his, duo cu congue prodesset. Ut epicuri invenire duo, novum ridens eu has, in natum meliore noluisse sea. Has ei stet explicari. No nam eirmod deterruisset, nusquam electram rationibus ad sea, interesset delicatissimi et sit. Purto molestiae cu eum, in per hinc periculis intellegam.

Id porro facete cum. No est veritus detraxit facilisis, sit ea clita decore essent. Ut eam labores fuisset menandri, ex sit brute viderer eleifend, altera argumentum vel ex. Duo at zril sensibus, eu vim ullum assentior, quando possit at his.

Te nam tempor posidonium scripserit, eam mundi reprimique dissentias ne. Vim te soleat offendit democritum. Nam an diam elaboraret, quaeque dissentias an has. Autem legendos dignissim ad vis, sea ex amet petentium reprehendunt, inermis constituam philosophia ne mel. Esse noster lobortis usu ne.

Nec reque postea urbanitas ut, mea in nulla invidunt ocurreret. Ei duo iuvaret numquam. Ferri nemore audire te est, mel et detracto noluisse. Nec eu habeo justo, id pro posse apeirian volutpat. Mea sonet quaestio ne.

Atqui quaeque alienum te vim. Graeco aliquip liberavisse pro ut. Te similique reformidans usu, te mundi aliquando ius. Meis scripta minimum quo no, meis prima fabellas eu eam, laoreet delicata forensibus ut vim. Et quo vocibus mediocritatem, atqui summo an eam.

"""

# create a inout file with some text
input_file = 'input.txt'
f = open(input_file, "w+")
f.write(input_text)
f.close()

#Open the file in read mode
with open(input_file, 'r') as f:
with mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ) as m:
print(f"Output \n*** Output first 5 bytes of the {input_file} is {m.read(5)} ")
print(f"*** Output Next 10 bytes of the {input_file} is {m.read(10)} ")

ผลลัพธ์

*** Output first 5 bytes of the input.txt is b'Lorem'
*** Output Next 10 bytes of the input.txt is b' ipsum dol'

3. เราอ่านไฟล์และจับคู่กับหน่วยความจำแล้ว และใช้ .read() เพื่ออ่าน 5 ไบต์แรก ดังนั้นตัวชี้ไฟล์จะเลื่อนไปข้างหน้า 10 ไบต์หลังจากอ่านครั้งแรก ตอนนี้ถ้าคุณอ่านอีกครั้งหนึ่ง สมมติว่า read(10) ไบต์ จะให้ไบต์จาก 6 - 15

4.ในการตั้งค่าไฟล์ที่แมปหน่วยความจำเพื่ออัปเดต ให้เปิดไฟล์สำหรับ 'r+' (ไม่ใช่ 'w') ก่อนทำการแมป

ฉันจะแสดงตัวอย่างวิธีการแก้ไขส่วนของบรรทัดในตำแหน่ง

import mmap
import shutil

input_file = 'input.txt'
input_copy = input_file.replace('input','input_copy')

# Make a Copy of the file just to make sure original is un-modified.
shutil.copyfile(input_file,input_copy)

# word
word = b'ipsum'

# modified word
modified_word = word[::-1]

# Open the file to receive updates
with open(input_copy, 'r+') as f:
with mmap.mmap(f.fileno(), 0) as m:
print(f"output \n *** Line before updates \n {m.readline().rstrip()}")

# Rewind using seek
m.seek(0)

# find the word and reverse it
loc = m.find(word)
m[loc:loc + len(word)] = modified_word
m.flush()

# Rewind using seek
m.seek(0)
print(f" \n *** Line after updates \n {m.readline().rstrip()}")

f.seek(0)
print(f" \n *** Final file \n {f.readline().rstrip()}")

ผลลัพธ์

*** Line before updates
b'Lorem ipsum dolor sit amet, causae apeirian ea his, duo cu congue prodesset. Ut epicuri invenire duo, novum ridens eu has, in natum meliore noluisse sea. Has ei stet explicari. No nam eirmod deterruisset, nusquam electram rationibus ad sea, interesset delicatissimi et sit. Purto molestiae cu eum, in per hinc periculis intellegam.'

*** Line after updates
b'Lorem muspi dolor sit amet, causae apeirian ea his, duo cu congue prodesset. Ut epicuri invenire duo, novum ridens eu has, in natum meliore noluisse sea. Has ei stet explicari. No nam eirmod deterruisset, nusquam electram rationibus ad sea, interesset delicatissimi et sit. Purto molestiae cu eum, in per hinc periculis intellegam.'

*** Final file
Lorem muspi dolor sit amet, causae apeirian ea his, duo cu congue prodesset. Ut epicuri invenire duo, novum ridens eu has, in natum meliore noluisse sea. Has ei stet explicari. No nam eirmod deterruisset, nusquam electram rationibus ad sea, interesset delicatissimi et sit. Purto molestiae cu eum, in per hinc periculis intellegam.

5.คำว่า “ipsum” จะถูกแทนที่ตรงกลางบรรทัดแรกในหน่วยความจำและในไฟล์

6. ไม่ว่าด้วยเหตุผลใดก็ตามที่คุณต้องการเห็นการเปลี่ยนแปลงในหน่วยความจำและไม่ต้องการอัปเดตไฟล์บนดิสก์ ให้ใช้ ACCESS_COPY

import mmap
import shutil

input_file = 'input.txt'
input_copy = input_file.replace('input','input_copy')

# Make a Copy of the file just to make sure original is un-modified.
shutil.copyfile(input_file,input_copy)

# word
word = b'ipsum'

# modified word
modified_word = word[::-1]

# Open the file to receive updates
with open(input_copy, 'r+') as f:
with mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_COPY) as m:
print(f"output \n *** Line before updates \n {m.readline().rstrip()}")

# Rewind using seek
m.seek(0)

# find the word and reverse it
loc = m.find(word)
m[loc:loc + len(word)] = modified_word
m.flush()

# Rewind using seek
m.seek(0)
print(f" \n *** Line after updates \n {m.readline().rstrip()}")

f.seek(0)
print(f" \n *** Final file \n {f.readline().rstrip()}")

ผลลัพธ์

*** Line before updates
b'Lorem ipsum dolor sit amet, causae apeirian ea his, duo cu congue prodesset. Ut epicuri invenire duo, novum ridens eu has, in natum meliore noluisse sea. Has ei stet explicari. No nam eirmod deterruisset, nusquam electram rationibus ad sea, interesset delicatissimi et sit. Purto molestiae cu eum, in per hinc periculis intellegam.'

*** Line after updates
b'Lorem muspi dolor sit amet, causae apeirian ea his, duo cu congue prodesset. Ut epicuri invenire duo, novum ridens eu has, in natum meliore noluisse sea. Has ei stet explicari. No nam eirmod deterruisset, nusquam electram rationibus ad sea, interesset delicatissimi et sit. Purto molestiae cu eum, in per hinc periculis intellegam.'

*** Final file
Lorem ipsum dolor sit amet, causae apeirian ea his, duo cu congue prodesset. Ut epicuri invenire duo, novum ridens eu has, in natum meliore noluisse sea. Has ei stet explicari. No nam eirmod deterruisset, nusquam electram rationibus ad sea, interesset delicatissimi et sit. Purto molestiae cu eum, in per hinc periculis intellegam.

7.สังเกตเนื้อหาในอินพุตและเอาต์พุตที่ไม่เปลี่ยนแปลง ในขณะที่การเปลี่ยนแปลงจะใช้กับหน่วยความจำในหน่วยความจำเท่านั้น