python3從零學習-5.8.4、mmap—內存映射文件支持

mmap — 內存映射文件支持

內存映射(mmap)文件對象的行爲既像 bytearray 又像 文件對象。 你可以在大部分接受 bytearray 的地方使用 mmap 對象;例如,你可以使用 re 模塊來搜索一個內存映射文件。 你也可以通過執行 obj[index] = 97 來修改單個字節,或者通過對切片賦值來修改一個子序列: obj[i1:i2] = b'...'。 你還可以在文件的當前位置開始讀取和寫入數據,並使用 seek() 前往另一個位置。

 

內存映射文件是由 mmap 構造函數創建的,其在 Unix和 Windows上是不同的。 無論哪種情況,你都必須爲一個打開的文件提供文件描述符以進行更新。 如果你希望映射一個已有的 Python 文件對象,請使用該對象的 fileno() 方法來獲取 fileno 參數的正確值。 否則,你可以使用 os.open() 函數來打開這個文件,這會直接返回一個文件描述符(結束時仍然需要關閉該文件)。

註解:如果要爲可寫的緩衝文件創建內存映射,則應當首先 flush() 該文件。 這確保了對緩衝區的本地修改在內存映射中可用。

 

對於構造函數的Unix和Windows版本,可以將access指定爲一個可選的關鍵字參數。access接受以下三個值中的一個:ACCESS_READ、ACCESS_WRITE或ACCESS_COPY,分別指定只讀、寫進或寫時複製內存。access可以在Unix和Windows上使用。如果沒有指定訪問權限,Windows mmap將返回寫通映射。所有三種訪問類型的初始內存值都取自指定的文件。賦值給ACCESS_READ內存映射會引發類型錯誤異常。對ACCESS_WRITE內存映射的賦值同時影響內存和底層文件。賦值給ACCESS_COPY內存映射會影響內存,但不會更新底層文件。

 

要映射匿名內存,應將 -1 作爲 fileno 和 length 一起傳遞。

class mmap.mmap(fileno, length, tagname=None, access=ACCESS_DEFAULT[, offset])

( Windows 版本) 映射被文件句柄 fileno 指定的文件的 length 個字節,並創建一個 mmap 對象。如果 length 大於當前文件大小,則文件將擴展爲包含 length 個字節。如果 length 爲 0,則映射的最大長度爲當前文件大小。如果文件爲空, Windows 會引發異常(你無法在Windows上創建空映射)。

 

如果 tagname 被指定且不是 None ,則是爲映射提供標籤名稱的字符串。 Windows 允許你對同一文件擁有許多不同的映射。如果指定現有標籤的名稱,則會打開該標籤,否則將創建該名稱的新標籤。如果省略此參數或設置爲 None ,則創建的映射不帶名稱。避免使用 tag 參數將有助於使代碼在Unix和Windows之間可移植。

 

offset 可以被指定爲非負整數偏移量。 mmap 引用將相對於從文件開頭的偏移。 offset 默認爲0。 offeset 必須是 ALLOCATIONGRANULARITY 的倍數。

 

class mmap.mmap(fileno, length, flags=MAP_SHARED, prot=PROT_WRITE|PROT_READ, access=ACCESS_DEFAULT[, offset])

(Unix 版本) 映射文件描述符 fileno 指定的文件的 length 個字節,並返回一個 mmap 對象。如果 length 爲 0 ,則當調用 mmap 時,映射的最大長度將爲文件的當前大小。

 

flags指定映射的性質。MAP_PRIVATE創建一個私有的寫時複製映射,因此對mmap對象內容的更改將是該進程的私有,MAP_SHARED創建一個映射,該映射與映射文件相同區域的所有其他進程共享。默認值是MAP_SHARED。

 

如果指定了prot,則提供所需的內存保護;兩個最有用的值是PROT_READ和PROT_WRITE,它們指定可以讀取或寫入頁面。prot默認爲PROT_READ | PROT_WRITE。

 

access可以代替標誌和prot指定爲可選的關鍵字參數。同時指定標誌、prot和訪問權限是錯誤的。有關如何使用此參數的信息,請參閱上面的訪問描述。

 

偏移量可以指定爲非負整數偏移量。mmap引用將相對於從文件開始的偏移量。偏移量默認值爲0。偏移量必須是分配粒度的倍數,這等於Unix系統上的PAGESIZE。

 

爲了確保創建的內存映射的有效性,描述符fileno指定的文件在內部自動與Mac OS X和OpenVMS上的物理備份存儲同步。

 

close()

關閉mmap。對該對象的其他方法的後續調用將導致引發ValueError異常。

 

closed

如果文件已關閉,則爲真。

 

find(sub[, start[, end]])

返回子序列子序列所在對象的最低索引,使子序列包含在[start, end]範圍內。可選參數start和end被解釋爲片表示法。如果失敗,返回-1。

 

flush([offset[, size]])

將對內存中文件副本所做的更改刷新回磁盤。如果不使用此調用,就不能保證在銷燬對象之前將更改寫回。如果指定了偏移量和大小,只有對給定字節範圍的更改將刷新到磁盤;否則,將刷新映射的整個範圍。偏移量必須是頁面大小或分配粒度的倍數。

 

(Windows版本)返回的非零值表示成功;零表示失敗。

 

(Unix版本)返回零值以表示成功。當調用失敗時將引發異常。

 

move(dest, src, count)

將從src偏移量開始的計數字節複製到目標索引dest。如果mmap是用ACCESS_READ創建的,那麼調用move將會引發一個類型錯誤異常。

 

read([n])

返回一個從當前文件位置開始最多包含n個字節的字節。如果參數被省略、None或negative,則返回從當前文件位置到映射末尾的所有字節。文件位置被更新爲指向返回的字節之後。

 

read_byte()

以整數形式返回當前文件位置的字節,並將文件位置向前推進1。

 

readline()

返回單行,從當前文件位置開始,一直到下一個換行。

 

resize(newsize)

調整映射和基礎文件(如果有的話)的大小。如果mmap是用ACCESS_READ或ACCESS_COPY創建的,調整映射的大小將引發類型錯誤異常。

 

rfind(sub[, start[, end]])

返回子序列子索引所在對象的最高索引,使子索引包含在[start, end]範圍內。可選參數start和end被解釋爲片表示法。如果失敗,返回-1。

 

seek(pos[, whence])

設置文件的當前位置。該參數是可選的,並且是os的默認值。SEEK_SET或0(絕對文件定位);其他值是os。SEEK_CUR或1(相對於當前位置進行查找)和os。SEEK_END或2(相對於文件的末端進行查找)。

 

size()

返回文件的長度,該長度可以大於內存映射區域的大小。

 

tell()

返回文件指針的當前位置。

 

write(bytes)

將字節以字節的形式寫入文件指針的當前位置的內存中,並返回寫入的字節數(決不小於len(bytes),因爲如果寫入失敗,將會產生一個ValueError)。文件位置被更新爲指向寫入的字節之後。如果mmap是用ACCESS_READ創建的,那麼寫入它將引發類型錯誤異常。

 

write_byte(byte)

在文件指針的當前位置將整數字節寫入內存;文件位置向前進1。如果mmap是用ACCESS_READ創建的,那麼寫入它將引發類型錯誤異常。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章