python mmap对象
----使用內(nèi)存映射的原因
為了隨機訪問文件的內(nèi)容,使用mmap將文件映射到內(nèi)存中是一個高效和優(yōu)雅的方法。例如,無需打開一個文件并執(zhí)行大量的seek(),read(),write()調(diào)用,只需要簡單的映射文件并使用切片操作訪問數(shù)據(jù)即可。
內(nèi)存映射一個文件并不會導(dǎo)致這個文件被讀取到內(nèi)存中。也就是說,文件并沒有被復(fù)制到內(nèi)存緩存或數(shù)組中。相反,操作系統(tǒng)僅僅為文件內(nèi)容保留了一段虛擬內(nèi)存。當(dāng)訪問文件的不同區(qū)域時,這些區(qū)域的內(nèi)容才根據(jù)需要被讀取并映射到內(nèi)存區(qū)域中。而那些從沒被訪問到的部分還是留在磁盤上。所有這些過程都是透明的,在幕后完成。
如果多個python解釋器內(nèi)存映射同一個文件,得到的mmap對象能夠被用來在解釋器直接交換數(shù)據(jù)。也就是說,所有解釋器都能同時讀寫數(shù)據(jù),并且其中一個結(jié)婚iqsuozuo的修改會自動呈現(xiàn)在其他解釋器中。很明顯,這里需要考慮同步的問題。但是這種方法有時候可以用來在關(guān)島或套接字間傳遞數(shù)據(jù)。
?
----mmap是什么
mmap是一種虛擬內(nèi)存映射文件的方法,它可以將一個文件或者其它對象映射到進程的地址空間,實現(xiàn)文件磁盤地址和進程虛擬地址空間中一段虛擬地址的一一對應(yīng)關(guān)系。
?
?
mmap 模塊提供“內(nèi)存映射的文件對象”,mmap 對象可以用在使用 plain string 的地方,mmap 對象和 plain string 的區(qū)別是:
- mmap 對象不提供字符串對象的方法;
- mmap 對象是可變的,而 str 對象是不可變的
- mmap 對象同時對應(yīng)于打開的文件,多態(tài)于一個Python file 對象
mmap 對象可以切片和索引,也可以為它的切片或索引賦值(因為 mmap 對象是可變的),為 mmap 對象的切片賦值時,賦值語句右值的長度必須和左值切片的長度相同。mmap 對象可以作為進程間通過文件進行 IPC 的一種替換手段。
?
----創(chuàng)建 mmap 對象
mmap(filedesc, length, tagname='') #windows mmap(filedesc, length, flag=MAP_SHARED, prot=PROT_READ|PROT_WRITE) #Unix創(chuàng)建并返回一個 mmap 對象,參數(shù) filedesc 通常是由 f.fileno()獲得的,這在Python文件系列中已經(jīng)介紹過。
mmap 創(chuàng)建對象的含義是:將指定 fd 的前 length 字節(jié)映射到內(nèi)存。
Windows中,可以通過參數(shù)tagname為一段內(nèi)存映射指定名稱,這樣一個文件上面可以同時具有多個 mmap。windows中的內(nèi)存映射都是可讀可寫的,同時在進程之間共享。
Unix平臺上,參數(shù)?flags?的可選值包括:
mmap.MAP_PRIVATE:這段內(nèi)存映射只有本進程可用;
mmap.MAP_SHARED:將內(nèi)存映射和其他進程共享,所有映射了同一文件的進程,都能夠看到其中一個所做的更改;
參數(shù) prot 對應(yīng)的取值包括:mmap.PROT_READ, mmap.PROT_WRITE 和 mmap.PROT_WRITE | mmap.PROT_READ。最后一者的含義是同時可讀可寫。
?
----mmap 對象的方法
?m.close()? 關(guān)閉 m 對應(yīng)的文件;
?m.find(str, start=0)? 從 start 下標(biāo)開始,在 m 中從左往右尋找子串 str 最早出現(xiàn)的下標(biāo);
?m.flush([offset, n])? 把 m 中從offset開始的n個字節(jié)刷到對應(yīng)的文件中,參數(shù) offset 要么同時指定,要么同時不指定;
?m.move(dstoff, srcoff, n)? 等于 m[dstoff:dstoff+n] = m[srcoff:srcoff+n],把從 srcoff 開始的 n 個字節(jié)復(fù)制到從 dstoff 開始的n個字節(jié),可能會覆蓋重疊的部分。
?m.read(n)? 返回一個字符串,從 m 對應(yīng)的文件中最多讀取 n 個字節(jié),將會把 m 對應(yīng)文件的位置指針向后移動;
?m.read_byte()? 返回一個1字節(jié)長的字符串,從 m 對應(yīng)的文件中讀1個字節(jié),要是已經(jīng)到了EOF還調(diào)用 read_byte(),則拋出異常 ValueError;
?m.readline()? 返回一個字符串,從 m 對應(yīng)文件的當(dāng)前位置到下一個'\n',當(dāng)調(diào)用 readline() 時文件位于 EOF,則返回空字符串;
?m.resize(n)? 把 m 的長度改為 n,m 的長度和 m 對應(yīng)文件的長度是獨立的;
?m.seek(pos, how=0)? 同 file 對象的 seek 操作,改變 m 對應(yīng)的文件的當(dāng)前位置;
?m.size() ? 返回 m 對應(yīng)文件的長度(不是 m 對象的長度len(m));
?m.tell()? 返回 m 對應(yīng)文件的當(dāng)前位置;
?m.write(str)? 把 str 寫到 m 對應(yīng)文件的當(dāng)前位置,如果從 m 對應(yīng)文件的當(dāng)前位置到 m 結(jié)尾剩余的空間不足len(str),則拋出?ValueError;
?m.write_byte(byte)? 把1個字節(jié)(對應(yīng)一個字符)寫到?m 對應(yīng)文件的當(dāng)前位置,實際上 m.write_byte(ch) 等于 m.write(ch)。如果?m 對應(yīng)文件的當(dāng)前位置在 m 的結(jié)尾,也就是?m 對應(yīng)文件的當(dāng)前位置到 m 結(jié)尾剩余的空間不足1個字節(jié),write() 拋出異常ValueError,而 write_byte() 什么都不做。
?
?
參考:
https://www.cnblogs.com/Security-Darren/p/4733387.html
https://docs.python.org/2/library/mmap.html
轉(zhuǎn)載于:https://www.cnblogs.com/baxianhua/p/10212766.html
總結(jié)
以上是生活随笔為你收集整理的python mmap对象的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: js循环(for/for in/forE
- 下一篇: Python中metaclass解释