python mmap對象


----使用內存映射的原因

為了隨機訪問文件的內容,使用mmap將文件映射到內存中是一個高效和優雅的方法。例如,無需打開一個文件並執行大量的seek(),read(),write()調用,只需要簡單的映射文件並使用切片操作訪問數據即可。

內存映射一個文件並不會導致這個文件被讀取到內存中。也就是說,文件並沒有被復制到內存緩存或數組中。相反,操作系統僅僅為文件內容保留了一段虛擬內存。當訪問文件的不同區域時,這些區域的內容才根據需要被讀取並映射到內存區域中。而那些從沒被訪問到的部分還是留在磁盤上。所有這些過程都是透明的,在幕后完成。

如果多個python解釋器內存映射同一個文件,得到的mmap對象能夠被用來在解釋器直接交換數據。也就是說,所有解釋器都能同時讀寫數據,並且其中一個結婚iqsuozuo的修改會自動呈現在其他解釋器中。很明顯,這里需要考慮同步的問題。但是這種方法有時候可以用來在關島或套接字間傳遞數據。

 

----mmap是什么

mmap是一種虛擬內存映射文件的方法,它可以將一個文件或者其它對象映射到進程的地址空間,實現文件磁盤地址和進程虛擬地址空間中一段虛擬地址的一一對應關系。

 

 

mmap 模塊提供“內存映射的文件對象”,mmap 對象可以用在使用 plain string 的地方,mmap 對象和 plain string 的區別是:

  • mmap 對象不提供字符串對象的方法;
  • mmap 對象是可變的,而 str 對象是不可變的
  • mmap 對象同時對應於打開的文件,多態於一個Python file 對象

  mmap 對象可以切片和索引,也可以為它的切片或索引賦值(因為 mmap 對象是可變的),為 mmap 對象的切片賦值時,賦值語句右值的長度必須和左值切片的長度相同。mmap 對象可以作為進程間通過文件進行 IPC 的一種替換手段。

 

----創建 mmap 對象

mmap(filedesc, length, tagname='') #windows mmap(filedesc, length, flag=MAP_SHARED, prot=PROT_READ|PROT_WRITE) #Unix

  創建並返回一個 mmap 對象,參數 filedesc 通常是由 f.fileno()獲得的,這在Python文件系列中已經介紹過。

  mmap 創建對象的含義是:將指定 fd 的前 length 字節映射到內存。

  Windows中,可以通過參數tagname為一段內存映射指定名稱,這樣一個文件上面可以同時具有多個 mmap。windows中的內存映射都是可讀可寫的,同時在進程之間共享。

  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() 什么都不做。

 

 

參考:

https://www.cnblogs.com/Security-Darren/p/4733387.html

https://docs.python.org/2/library/mmap.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM