কম্পিউটার

MMAP ফাংশন সহ পাইথনে ফাইল পড়ার কর্মক্ষমতা কীভাবে উন্নত করবেন?


পরিচয়..

MMAP সংক্ষেপে মেমরি ম্যাপিং হিসাবে পরিচিত হয় যখন একটি ফাইলে ম্যাপ করা হয় অপারেটিং সিস্টেম ভার্চুয়াল মেমরি ব্যবহার করে ফাইল সিস্টেমে সরাসরি ডেটা অ্যাক্সেস করতে, সাধারণ I/O ফাংশনগুলির সাথে ডেটা অ্যাক্সেস করার পরিবর্তে। সেখানে I/O পারফরম্যান্সের উন্নতি করে কারণ এটি প্রতিটি অ্যাক্সেসের জন্য আলাদা সিস্টেম কল করার বা বাফারগুলির মধ্যে ডেটা অনুলিপি করার প্রয়োজন হয় না৷

প্রকৃতপক্ষে মেমরিতে যেকোন কিছু যেমন, ইন-মেমরি তৈরি করা হলে একটি SQLlite ডাটাবেস ডিস্কের তুলনায় ভালো পারফরম্যান্স পায়।

আপনি কি করতে চান তার উপর নির্ভর করে মেমরি-ম্যাপ করা ফাইলগুলিকে পরিবর্তনযোগ্য স্ট্রিং বা ফাইলের মতো বস্তু হিসাবে বিবেচনা করা যেতে পারে৷

MMAP অনেক পদ্ধতি সমর্থন করে, যেমন close(), flush(), read(), readline(), seek(), tell(), write() এবং স্লাইস অপারেশন এবং এমনকি রেগুলার এক্সপ্রেশনের সাথে খুব ভালোভাবে কাজ করতে পারে।

কিভাবে করতে হবে..

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, in natum meliore noluisse sea. ei স্টেট ব্যাখ্যা আছে. No nam eirmod deterruisset, Nusquam electram rationibus ad sea, interestsset delicatissimi et sit. Purto molestiae cu eum, in per hinc periculis intellegam.

আইডি porro facete কাম. কোন veritus detraxit facilisis, বসে ea clita decore essent. Ut eam labores fuisset menandri, ex sit brute viderer eleifend, altera argumentum vel exce. ডুও অ্যাট জিল সেন্সিবাস, ইউ ভিম উলুম অ্যাসেনটিওর, কোয়ান্ডো পজিট অ্যাট হিজ৷

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 অনুরোধ পোস্টিয়া urbanitas ut, mea in nulla invidunt ocurreret. Ei duo iuvaret numquam. ফেরি নেমোর অডিরে টে ইস্ট, মেল এট ডিট্রাক্টো নোলুইস। Nec eu habeo justo, id pro posse apeirian volutpat. Mea sonet quaestio ne.

অ্যাটকুই কোয়াইক এলিয়েনম তে ভিম। গ্রেকো aliquip liberavisse প্রো ut. Te similique reformidans usu, te mundi aliquando ius. Meis scripta ন্যূনতম কোন নম্বর, meis prima fabellas eu eam, laoreet delicata forensibus ut vim. এট quo vocibus mediocritatem, atqui summo an eam.

2. আমরা একটি মেমরি-ম্যাপ করা ফাইল তৈরি করতে mmap() ফাংশন ব্যবহার করব। আমরা ফাইল অবজেক্টের fileno() পদ্ধতি বা 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. আমরা ফাইলটি পড়েছি এবং মেমরিতে ম্যাপ করেছি এবং প্রথম 5 বাইট পড়ার জন্য .read() ব্যবহার করেছি। সুতরাং ফাইল পয়েন্টার প্রথম পড়ার পরে 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. পর্যবেক্ষণ করুন, ইনপুট এবং আউটপুটের বিষয়বস্তু যা অপরিবর্তিত, যখন পরিবর্তনগুলি শুধুমাত্র ইন-মেমরিতে প্রয়োগ করা হয়৷


  1. কিভাবে একটি নতুন ফাইল সিস্টেম দিয়ে উইন্ডোজ পারফরম্যান্স উন্নত করা যায়

  2. পাইথনে ডিফ দিয়ে সংজ্ঞায়িত একটি ফাংশন কীভাবে প্লট করবেন? (ম্যাটপ্লটলিব)

  3. পাইথনে ZIPFILE মডিউল দিয়ে ফাইলগুলি কীভাবে সংকুচিত করবেন।

  4. পাইথন টিকিন্টারে asksaveasfile() ফাংশন