為了隨機訪問檔案的內容,使用mmap將檔案對映到記憶體中是乙個高效和優雅的方法。例如,無需開啟乙個檔案並執行大量的seek(),read(),write()呼叫,只需要簡單的對映檔案並使用切片操作訪問資料即可。
記憶體對映乙個檔案並不會導致這個檔案被讀取到記憶體中。也就是說,檔案並沒有被複製到記憶體快取或陣列中。相反,作業系統僅僅為檔案內容保留了一段虛擬記憶體。當訪問檔案的不同區域時,這些區域的內容才根據需要被讀取並對映到記憶體區域中。而那些從沒被訪問到的部分還是留在磁碟上。所有這些過程都是透明的,在幕後完成。
mmap是一種虛擬記憶體對映檔案的方法,它可以將乙個檔案或者其它物件對映到程序的位址空間,實現檔案磁碟位址和程序虛擬位址空間中一段虛擬位址的一一對應關係。
*mmap 模組提供「記憶體對映的檔案物件」,mmap 物件可以用在使用 plain string 的地方,mmap 物件和 plain string 的區別是:
1、使用mmap需要注意的乙個關鍵點是,mmap對映區域大小必須是物理頁大小(page_size)的整倍數(32位系統中通常是4k位元組)。原因是,記憶體的最小粒度是頁,而程序虛擬位址空間和記憶體的對映也是以頁為單位。為了匹配記憶體的操作,mmap從磁碟到虛擬位址空間的對映也必須是頁。
2、核心可以跟蹤被記憶體對映的底層物件(檔案)的大小,程序可以合法的訪問在當前檔案大小以內又在記憶體對映區以內的那些位元組。也就是說,如果檔案的大小一直在擴張,只要在對映區域範圍內的資料,程序都可以合法得到,這和對映建立時檔案的大小無關。具體情形參見「情形三」。
3、對映建立之後,即使檔案關閉,對映依然存在。因為對映的是磁碟的位址,不是檔案本身,和檔案控制代碼無關。同時可用於程序間通訊的有效位址空間不完全受限於被對映檔案的大小,因為是按頁對映。
m=mmap.mmap(fileno, length[
, flags[
, prot[
, access[
, offset]]]
])
引數
功能fileno
檔案描述符,可以是file物件的fileno()方法,或者來自os.open(),在呼叫mmap()之前開啟檔案,不再需要檔案時要關閉。
length
要對映檔案部分的大小(以位元組為單位),這個值為0,則對映整個檔案,如果大小大於檔案當前大小,則擴充套件這個檔案。
flags
map_private:這段記憶體對映只有本程序可用;mmap.map_shared:將記憶體對映和其他程序共享,所有映**同一檔案的程序,都能夠看到其中乙個所做的更改;
prot
mmap.prot_read, mmap.prot_write 和 mmap.prot_write ,mmap.prot_read。最後一者的含義是同時可讀可寫。
access
在mmap中有可選引數access的值有:access_read:讀訪問。access_write:寫訪問,預設。access_copy:拷貝訪問,不會把更改寫入到檔案,使用flush把更改寫到檔案。
mmap物件的函式
函式功能
close()
關閉 m 對應的檔案
m.find(str, start=0)
從 start 下標開始,在 m 中從左往右尋找子串 str 最早出現的下標
m.flush([offset, n])
把 m 中從offset開始的n個位元組刷到對應的檔案中
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.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)
file的seek()函式
seek() 方法用於移動檔案讀取指標到指定位置。
fileobject.seek(offset[
, whence]
)
檔案對映mmap
學習文獻 標頭檔案 include include 定義函式 void mmap void start,size t length,int prot,int flags,int fd,off t offsize 函式說明 mmap 用來將某個檔案內容對映到記憶體中,對該記憶體區域的訪問即是直接對該檔...
MMAP檔案對映
mmap檔案對映 mmap 系統呼叫使得程序之間通過對映同乙個普通檔案實現共享記憶體。普通檔案被對映到程序位址空間後,程序可以像訪問普通記憶體一樣對檔案進行訪問,不必再呼叫read write 等操作。注 實際上,mmap 系統呼叫並不是完全為了用於共享記憶體而設計的。它本身提供了不同於一般對普通檔...
檔案對映mmap
磁碟與記憶體的對映就是檔案對映,說這個問題之前我們先說下swap,因為 這個問題讓我很容易想起swap,linux swap 是交換分割槽的意思,在記憶體不 夠的情況下,作業系統先把記憶體與磁碟的swap區進行乙個 對映 然後把 這些記憶體解放出來放入記憶體中,為之後的程序的騰出一塊記憶體空間,等到...