Python mmap模組 記憶體對映的二進位制檔案

2021-09-28 18:30:02 字數 2521 閱讀 1929

你想記憶體對映乙個二進位制檔案到乙個可變位元組陣列中,目的可能是為了隨機訪問它的內容或者是原地做些修改。

使用mmap模組來記憶體對映檔案。 下面是乙個工具函式,向你演示了如何開啟乙個檔案並以一種便捷方式記憶體對映這個檔案。

import os

import mmap

def memory_map(filename, access=mmap.access_write):

size = os.path.getsize(filename)

fd = os.open(filename, os.o_rdwr)

return mmap.mmap(fd, size, access=access)

為了使用這個函式,你需要有乙個已建立並且內容不為空的檔案。 下面是乙個例子,教你怎樣初始建立乙個檔案並將其內容擴充到指定大小:

>>> size = 1000000

>>> with open('data', 'wb') as f:

... f.seek(size-1)

... f.write(b'\x00')

...>>>

下面是乙個利用memory_map()函式類記憶體對映檔案內容的例子:

>>> m = memory_map('data')

>>> len(m)

1000000

>>> m[0:10]

b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'

>>> m[0]

0>>> # reassign a slice

>>> m[0:11] = b'hello world'

>>> m.close()

>>> # verify that changes were made

>>> with open('data', 'rb') as f:

... print(f.read(11))

...b'hello world'

>>>

mmap()返回的mmap物件同樣也可以作為乙個上下文管理器來使用, 這時候底層的檔案會被自動關閉。比如:

>>> with memory_map('data') as m:

... print(len(m))

... print(m[0:10])

...1000000

b'hello world'

>>> m.closed

true

>>>

預設情況下,memeory_map()函式開啟的檔案同時支援讀和寫操作。 任何的修改內容都會複製回原來的檔案中。 如果需要唯讀的訪問模式,可以給引數access賦值為mmap.access_read。比如:

m = memory_map(filename, mmap.access_read)
如果你想在本地修改資料,但是又不想將修改寫回到原始檔案中,可以使用mmap.access_copy

m = memory_map(filename, mmap.access_copy)
為了隨機訪問檔案的內容,使用mmap將檔案對映到記憶體中是乙個高效和優雅的方法。 例如,你無需開啟乙個檔案並執行大量的seek()read()write()呼叫, 只需要簡單的對映檔案並使用切片操作訪問資料即可。

一般來講,mmap()所暴露的記憶體看上去就是乙個二進位制陣列物件。 但是,你可以使用乙個記憶體檢視來解析其中的資料。比如:

>>> m = memory_map('data')

>>> # memoryview of unsigned integers

>>> v = memoryview(m).cast('i')

>>> v[0] = 7

>>> m[0:4]

b'\x07\x00\x00\x00'

>>> m[0:4] = b'\x07\x01\x00\x00'

>>> v[0]

263>>>

需要強調的一點是,記憶體對映乙個檔案並不會導致整個檔案被讀取到記憶體中。 也就是說,檔案並沒有被複製到記憶體快取或陣列中。相反,作業系統僅僅為檔案內容保留了一段虛擬記憶體。 當你訪問檔案的不同區域時,這些區域的內容才根據需要被讀取並對映到記憶體區域中。 而那些從沒被訪問到的部分還是留在磁碟上。所有這些過程是透明的,在幕後完成!

如果多個python直譯器記憶體對映同乙個檔案,得到的mmap物件能夠被用來在直譯器直接交換資料。 也就是說,所有直譯器都能同時讀寫資料,並且其中乙個直譯器所做的修改會自動呈現在其他直譯器中。 很明顯,這裡需要考慮同步的問題。但是這種方法有時候可以用來在管道或套接字間傳遞資料。

c語言學習筆記 記憶體管理 linux的記憶體映像

程式在記憶體中的儲存形式 程式儲存在flash中 程式在記憶體中主要分為以下幾段 段,資料段,唯讀資料段,bss段,堆,棧,檔案對映區,核心對映區 作業系統核心 程式一般存放在 段,在linux中又稱為文字段 資料段存放的一般是靜態變數和被初始化為非零值的全域性變數 bss段存放的是被初始化為零的全...

RTOS記憶體模組分析

記憶體模組是作業系統中的重要的模組,也是編碼時運用較多的,本文講述記憶體的實現,分析實時嵌入式作業系統記憶體模組的實現,如常見的 nucleus plus,threadx 實時嵌入式作業系統,如 nucleus plus,threadx 中一般具有兩種記憶體的分配方式,把它歸納為塊記憶體和池記憶體 ...

記憶體開銷記錄模組

利用hash表來記錄 在程式中malloc和free記憶體的情況 memorymanage.h ifndef memorymanage h define memorymanage h include include include define max node num 15 define file...