Python將文件映射到內存使用mmap.mmap()函數方式
更新時間:2024年02月10日 09:57:52 作者:AllardZhao
這篇文章主要介紹了Python將文件映射到內存使用mmap.mmap()函數方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
如何將文件映射到內存
實際案例
(1)在訪問某些二進制文件時,希望能把文件映射到內存中,可以實現隨機訪問。(framebuffer設備文件)
(2)某些嵌入式設備,寄存器被編址到內存地址空間,我們可以映射/dev/mem某范圍,去訪問這些寄存器。
(3)如果多個進程映射同一個文件,還能實現進程通信的目的。
解決方案
使用標準庫中mmap模塊的mmap()函數,它需要一個打開的文件描述作為參數。
代碼演示
# 使用dd命令創(chuàng)建大小為1M的,每個字節(jié)都是0的二進制文件demo.bin ~ % dd if=/dev/zero of=demo.bin bs=1024 count=1024 1024+0 records in 1024+0 records out 1048576 bytes transferred in 0.008838 secs (118644037 bytes/sec) # 以16進制形式查看這個文件 ~ % od -x demo.bin 0000000 0000 0000 0000 0000 0000 0000 0000 0000 * 4000000 # 接下來對這個文件進行映射
import mmap ''' mmap.mmap函數介紹: 需要注意對于不同的平臺對這個函數使用稍有差別。 Windows: mmap(fileno, length[, tagname[, access[, offset]]]) Unix: mmap(fileno, length[, flags[, prot[, access[, offset]]]]) fileno為文件描述符,并不是一個文件對象,文件描述符是由系統(tǒng)調用的open函數得到的, 系統(tǒng)調用的open函數在os.open(),也可以使用python的open函數 offset為指定映射區(qū)域,必須以頁對齊的 ''' # b為二進制模式,r+為讀寫權限 f = open('demo.bin', 'r+b') # 得到文件描述符 print(f.fileno()) # 做映射,映射區(qū)域長度為0映射整個文件,訪問權限寫 mn = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_WRITE) # m為mmap對象類似于數組一樣的操作 print(type(mn)) print(mn[0]) print(mn[10:20]) # 對文件進行寫操作 mn[0] = 88 # 字符串長度和切片長度保持一致 mn[4:8] = b'\xff' * 4 # 設置offset跳過4個頁,并且映射8個頁 mn2 = mmap.mmap(f.fileno(), mmap.PAGESIZE * 8, access=mmap.ACCESS_WRITE, offset=mmap.PAGESIZE * 4) # 對切片進行修改 mn2[:0x1000] = b'\xaa' * 0x1000
修改文件映射內存的內容并查看 # 修改映射地址內容 # 查看[0]、[4:8]和[:0x1000]內容修改 ~ % od -x demo.bin 0000000 0058 0000 ffff ffff 0000 0000 0000 0000 0000020 0000 0000 0000 0000 0000 0000 0000 0000 * 0040000 aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa * 0050000 0000 0000 0000 0000 0000 0000 0000 0000 * 4000000
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Python+pandas編寫命令行腳本操作excel的tips詳情
這篇文章主要介紹了Python+pandas編寫命令行腳本操作excel的tips詳情,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的朋友可以參考一下2022-07-07Python入門開發(fā)教程 windows下搭建開發(fā)環(huán)境vscode的步驟詳解
大家都知道Python是跨平臺的,它可以運行在Windows、Mac和各種Linux/Unix系統(tǒng)上。在Windows上寫Python程序,放到Linux上也是能夠運行的,今天給大家分享Python開發(fā)環(huán)境搭建vscode的步驟,一起看看吧2021-07-07