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

Làm cách nào để cải thiện hiệu suất đọc tệp bằng Python với chức năng MMAP?

Giới thiệu ..

MMAP viết tắt là ánh xạ bộ nhớ khi ánh xạ tới tệp sử dụng bộ nhớ ảo của hệ điều hành để truy cập trực tiếp dữ liệu trên hệ thống tệp, thay vì truy cập dữ liệu bằng các chức năng I / O thông thường. Ở đó, cải thiện hiệu suất I / O vì nó không yêu cầu thực hiện lệnh gọi hệ thống riêng biệt cho mỗi lần truy cập hoặc sao chép dữ liệu giữa các bộ đệm.

Trên thực tế, bất kỳ thứ gì trong bộ nhớ, chẳng hạn như cơ sở dữ liệu SQLlite khi được tạo trong memeory có hiệu suất tốt hơn so với trên đĩa.

Các tệp được ánh xạ bộ nhớ có thể được coi là các chuỗi có thể thay đổi hoặc các đối tượng giống tệp, tùy thuộc vào những gì bạn muốn làm.

MMAP hỗ trợ nhiều phương thức, chẳng hạn như close (), flush (), read (), readline (), seek (), tell (), write () và rất có thể hoạt động với các phép toán lát cắt và thậm chí cả biểu thức chính quy.

Cách thực hiện ..

1. Giả sử một tệp văn bản có nội dung bên dưới. Bạn có thể lấy văn bản này chỉ bằng cách sử dụng Google và tìm kiếm văn bản mẫu. Sao chép những nội dung này vào tệp input.txt.

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. Có ei stet explicari. No nam eirmod Deterruisset, biển quảng cáo nusquam electram rationibus, ... Purto moltiae cu eum, in per hinc periculis intellegam.

Id porro facete kiêm. Không có est veritus detraxitfyingisis, sit ea clita decore essent. Ut eam labores fuisset menandri, ex sit brute viderer eleifend, altera reasonum vel ex. Duo at zril sensibus, eu vim ullum assentior, quando Possit at his.

Tế nam tempor posidonium scripserit, eam mundi repmique dissentias ne. Vim te soleat phạm luật dân chủ. Nam an diam goneraret, quaeque dissentias an has. Autem legendos dignissim ad vis, sea ex amet petentium reployndunt, trơmis consuam Philosophia ne mel. Esse noster lobortis usu ne.

Nec reque postea urbantas ut, moc trong nulla invidunt ocurreret. Ei bộ đôi 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 ngoài hành tinh 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, laoreetophiata forensibus ut vim. Et quo vocibus tầm thường, atqui summmo an eam.

2.Chúng tôi sẽ Sử dụng hàm mmap () để tạo tệp ánh xạ bộ nhớ. Chúng ta có thể chuyển tên tệp bằng phương thức fileno () của một đối tượng tệp hoặc từ os.open ().

Lưu ý:Người dùng có trách nhiệm mở tệp trước khi gọi mmap () và đóng tệp đó.

Đối số thứ hai cho mmap () có kích thước tính bằng byte cho biết phần tệp cần ánh xạ. Nếu giá trị là 0, toàn bộ tệp sẽ được ánh xạ. Ngoài ra còn có một đối số bổ sung mà bạn có thể sử dụng, đó là ACCESS_READ cho quyền truy cập chỉ đọc, ACCESS_WRITE cho quyền truy cập ghi qua và ACCESS_COPY cho quyền sao chép khi ghi.

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

Đầu ra

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

3.Chúng tôi đã đọc tệp và ánh xạ vào bộ nhớ và sử dụng .read () để đọc 5 byte đầu tiên. Vì vậy, con trỏ tệp di chuyển trước 10 byte sau lần đọc đầu tiên. Bây giờ nếu bạn thực hiện thêm một lần đọc nữa, giả sử đọc (10) byte, nó cung cấp cho bạn số byte từ 6 - 15.

4.Để thiết lập tệp ánh xạ bộ nhớ cập nhật, hãy mở tệp 'r +' (không phải 'w') trước khi ánh xạ.

Tôi sẽ chỉ cho bạn một ví dụ về cách sửa đổi một phần của dòng tại chỗ.

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()}")

Đầu ra

*** 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. Từ “ipsum” được thay thế ở giữa dòng đầu tiên trong bộ nhớ và trong tệp.

6.Nếu, vì bất kỳ lý do gì bạn muốn xem các thay đổi trong bộ nhớ và không muốn cập nhật tệp trên đĩa, hãy sử dụng 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()}")

Đầu ra

*** 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. Tiết kiệm, nội dung trong đầu vào và đầu ra không thay đổi, trong khi những thay đổi chỉ áp dụng cho bộ nhớ trong.