Memory Mapping in Python

by 18:45 0 comments

Everything is an Object in Python ဆိုတဲ့အတိုင္း mmap ကလဲ object တစ္ခုေနာက္ string ေတြလိုမ်ိုးပါပဲ ဒါေပသိ ကြ်န္ေတာ္တို ့ျမင္ေနက် string objects ေတြလိုမပာုတ္တာကေတာ့ သူက mutable ျဖစ္ပါတယ္။ Mutable ျဖစ္ေတာ့ဘာျဖစ္သလဲဆိုေတာ့ List ေတြလိုပဲ character တစ္ခုျခင္းစီကို changes ျပုလုပ္နိုင္ပါတယ္။ ေနာက္ဆက္ေျပာရရင္ slicing နဲ ့ေတာင္ multiple characters ေတြကိုေျပာင္းလို့ရပါေသးတယ္။ ဒါေတြကပံုမွန္သံုးေနက် string ေတြမွာသြားလုပ္ရင္ error တက္လာမွာပါ။
အခုလိုမ်ိုးေတြအတြက္ mmap ဆိုတဲ့ module ေလးကလိုလာတယ္ဗ်။ mmap module ကရွင္းရမယ္ဆိုသူက memory ထဲက object ကို တိုက္ရိုက္ထိေတြ ့ပါတယ္။ ဒီအတြက္ mmap module ကိုသံုးရင္ဘာေကာင္းသလဲဆိုေတာ့ I/O Performance ကတက္လာပါတယ္။
ေအာက္ကေကာင္ေလးက mmap အသံုးျပုျပသြားတာပါ။
 import mmap  
   
 with open("hello.txt", "wb") as txt:  
   txt.write("Hello World\n")  
   
 with open("hello.txt", "r+b") as txt:  
   
   memap = mmap.mmap(txt.fileno(), 0) # 0 mean memory-map the whole file  
   
   print memap.readline()  
     
   print memap[:5] # Using Slicing Method  
   
   memap[6:] = "MSF!!\n"  
   memap.seek(0)  
   print memap.readline()  
   
   memap.close() # Closing  
ဒီ Example မွာေျပာစရာတစ္ခုေတာ့ရွိတယ္ ဆိုတဲ့ေကာင္မွာ character size ကတူတူပဲျဖစ္ရပါမယ္။ နွစ္ခုကိုျဖုတ္ျကည့္ေနာက္  ေနာက္တစ္ခုထည့္ျပီး run ျကည့္ပါ။ IndexError: mmap slice assignment is wrong sizeဆိုျပီးေပါ္လာမွာပါ။က်န္တာေတာ့ရွင္းမွာပါ။ ေနာက္ဥပမာတစ္ခုကိုသြားရေအာင္...

 import os  
 import mmap  
   
 text = open('text.txt', 'wb')  
 text.write('Cat is kawaii.\n')  
 text.close()  
   
 txt = open('text.txt', 'a+b')  
 memap = mmap.mmap(txt.fileno(), 0, access=mmap.ACCESS_WRITE)  
 memap[0] = 'R' # become -> Rat is kawaii  
 memap.flush()  
 memap.close()  
 txt.close()  
ဒီေကာင္ေလးကို run လိုက္ရင္ text.txt ဆိုတဲ့ file တစ္ခု create လုပ္လိုက္တယ္ ဘယ္လိုလုပ္သြားတာလဲေတာ့ရွင္းျပမေနပါဘူး သိျပီးသားျဖစ္မွာပါ။ ပထမဦးဆံုးေျပာစရာက
memap = mmap.mmap(txt.fileno(), 0, access=mmap.ACCESS_WRITE)
အဲ့လိုင္းထဲက ACCESS_WRITE ဆိုတာပါ။ ACCESS_WRITE ဆိုတာက optional parameter တစ္ခုထဲက option ၃ခုထဲကတစ္ခုပါပဲ။ ACCESS_WRITE အျပင္ ACCESS_READ နဲ ့ACCESS_COPY ဆိုတာရွိပါေသးတယ္။
ACCESS_READ ဆိုတာက read-only memory ကိုေျပာခ်င္တာပါ။
ACCESS_WRITE ကေတာ့ write-through memory ပါေနာက္၊
ACCESS_COPY ကေတာ့ copy-on-writeကိုဆိုလိုတာပါ။

ACCESS_READ ဆိုတဲ့  read-only memory ေအာက္မွာသာ assign လုပ္တာမ်ိုးေတြရွိတဲ့ရင္ TYPE ERROR တက္မွာပါ။ ACCESS_WRITE မွာသာ assign လုပ္ခဲ့ရင္ memory ေကာ underlying file ကိုေကာသက္ေရာက္မွုရွိပါတယ္။ ACCESS_COPY မွာသာ assign လုပ္ခဲ့ရင္ memory ကိုသာသက္ေရာက္မွုရွိမွာျဖစ္ျပီး underlying file ကဘာေျပာင္းလဲမွုမွရွိမွာမပာုတ္ပါဘူး။
က်န္သာေတြကေတာ့သေဘာေပါက္ျပီးသားျဖစ္မွာပါ။

mmap ကိုဆက္ေျပာရရင္ memory-mapped files ေတြက normal files ေတြထက္ performance ပိုေကာင္းပါတယ္ဒါကိုလဲအစမွာထဲကေျပာျပီးသားပါ ေနာက္ mmap ကို same file တစ္ခုထဲက read only အေနနဲ ့data ကို multiple processes လုပ္တဲ့ multithreaded programming မ်ိုးမွာသာအသံုးျပုခဲ့ရင္ memory save လုပ္ရာလဲေရာက္မွာပါ။
ဒါေပသိ........
မွတ္ထားဖို့က mmap က file object တစ္ခုအတြက္ကိုခင္ဗ်ားရဲ့ address space ထဲက fit ျဖစ္နိုင္မယ့္ contiguous addresses block ကိုရွာပါတယ္။ ဒီေတာ့အားနည္းခ်က္ကဘာရွိသလဲဆိုသင္က large files ျကီးေတြကိုအသံုးခ်ခ်ိန္မွာ သင့္ system မွာသာအဲ့ဒီ large file ကို fit ျဖစ္နိုင္မယ့္ contiguous addresses block  သာမရွိခဲ့ဘူးဆိုရင္ mmap ကအလုပ္လုပ္ေတာ့မွမပာုတ္ပါဘူး fail ျဖစ္သြားမွာပါ။ ေနာက္ mmap က pipes နဲ ့ ttys တို့လို special file objects ေတြနဲ့အလုပ္မလုပ္ပါဘူး။
PyLab (c) 2016

Pylab

Developer

Keep calm and love Python

0 comments:

Post a Comment