本文介紹Python mmap模塊與mmap對象的用法。python
mmap 模塊提供「內存映射的文件對象」,mmap 對象能夠用在使用 plain string 的地方,mmap 對象和 plain string 的區別是:windows
mmap 對象能夠切片和索引,也能夠爲它的切片或索引賦值(由於 mmap 對象是可變的),爲 mmap 對象的切片賦值時,賦值語句右值的長度必須和左值切片的長度相同。mmap 對象能夠做爲進程間經過文件進行 IPC 的一種替換手段。spa
建立 mmap 對象指針
mmap(filedesc, length, tagname='') #windows mmap(filedesc, length, flag=MAP_SHARED, prot=PROT_READ|PROT_WRITE) #Unix
建立並返回一個 mmap 對象,參數 filedesc 一般是由 f.fileno()得到的,這在Python文件系列中已經介紹過。code
mmap 建立對象的含義是:將指定 fd 的前 length 字節映射到內存。對象
Windows中,能夠經過參數tagname爲一段內存映射指定名稱,這樣一個文件上面能夠同時具備多個 mmap。windows中的內存映射都是可讀可寫的,同時在進程之間共享。blog
Unix平臺上,參數 flags 的可選值包括:索引
mmap.MAP_PRIVATE:這段內存映射只有本進程可用;進程
mmap.MAP_SHARED:將內存映射和其餘進程共享,全部映射了同一文件的進程,都可以看到其中一個所作的更改;內存
參數 prot 對應的取值包括:mmap.PROT_READ, mmap.PROT_WRITE 和 mmap.PROT_WRITE | mmap.PROT_READ。最後一者的含義是同時可讀可寫。
mmap 對象的方法
m.close() 關閉 m 對應的文件;
m.find(str, start=0) 從 start 下標開始,在 m 中從左往右尋找子串 str 最先出現的下標;
m.flush([offset, n]) 把 m 中從offset開始的n個字節刷到對應的文件中,參數 offset 要麼同時指定,要麼同時不指定;
m.move(dstoff, srcoff, n) 等於 m[dstoff:dstoff+n] = m[srcoff:srcoff+n],把從 srcoff 開始的 n 個字節複製到從 dstoff 開始的n個字節,可能會覆蓋重疊的部分。
m.read(n) 返回一個字符串,從 m 對應的文件中最多讀取 n 個字節,將會把 m 對應文件的位置指針向後移動;
m.read_byte() 返回一個1字節長的字符串,從 m 對應的文件中讀1個字節,要是已經到了EOF還調用 read_byte(),則拋出異常 ValueError;
m.readline() 返回一個字符串,從 m 對應文件的當前位置到下一個'\n',當調用 readline() 時文件位於 EOF,則返回空字符串;
m.resize(n) 把 m 的長度改成 n,m 的長度和 m 對應文件的長度是獨立的;
m.seek(pos, how=0) 同 file 對象的 seek 操做,改變 m 對應的文件的當前位置;
m.size() 返回 m 對應文件的長度(不是 m 對象的長度len(m));
m.tell() 返回 m 對應文件的當前位置;
m.write(str) 把 str 寫到 m 對應文件的當前位置,若是從 m 對應文件的當前位置到 m 結尾剩餘的空間不足len(str),則拋出 ValueError;
m.write_byte(byte) 把1個字節(對應一個字符)寫到 m 對應文件的當前位置,實際上 m.write_byte(ch) 等於 m.write(ch)。若是 m 對應文件的當前位置在 m 的結尾,也就是 m 對應文件的當前位置到 m 結尾剩餘的空間不足1個字節,write() 拋出異常ValueError,而 write_byte() 什麼都不作。
對於EOF的處理,write() 和 read_byte() 拋出異常 ValueError,而 write_byte() 和 read() 什麼都不作。
例:
# process 1 f = open('xxx', 'w') while True: data = raw_input('Enter some text:') f.seek(0) f.write(data) f.truncate() f.flush() # process 2 import mmap, os, time m = mmap.mmap(os.open('xxx', os.O_RDWR), 1) last = None while True: m.resize(m.size()) data = [:] if data != last: print data last = data time.sleep(5)
該例子中,process 1 等待用戶輸入新內容並將其寫入到文件 xxx 中,process 2 直接將整個文件映射到內存對象 m,而後每隔5秒檢查一下文件是否發生變化。