1. 程式人生 > >如何將檔案對映到記憶體

如何將檔案對映到記憶體

實際案例
  1. 在訪問某些二進位制檔案時,希望能把檔案對映到記憶體中,可以實現隨機訪問(如 framebuffer裝置檔案);
  2. 某些嵌入式裝置,暫存器被編址到記憶體地址空間,我們可以對映/dev/mem某範圍,去訪問這些暫存器;
  3. 如果多個程序對映同一個檔案,還能實現程序通訊的目的。

解決方案:使用標準庫中mmap模組的mmap()函式,它需要一個開啟的檔案描述符作為引數。

注:本案例在Linux系統下實驗。

在shell下,我們通過dd命令建立了一個數據全為0且大小為1M的二進位制檔案,通過od -x命令以十六進位制的方式檢視該檔案。

[email protected]
~/Desktop $ dd if=/dev/zero of=demo.bin bs=1024 count=1024 1024+0 records in 1024+0 records out 1048576 bytes (1.0 MB, 1.0 MiB) copied, 0.007549 s, 139 MB/s [email protected] ~/Desktop $ od -x demo.bin 0000000 0000 0000 0000 0000 0000 0000 0000 0000 * 4000000

我們在shell中鍵入如下命令將二進位制檔案對映到記憶體:

>>> f = open('demo.bin', 'r+b')
>>> import
mmap >>> m = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_WRITE) >>> type(m) <type 'mmap.mmap'> >>> m[0] '\x00' >>> m[10:20] '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> m[0] = '\x88' rookie@rookie ~/Desktop $ od -x demo.bin 0000000 0088 0000 0000 0000 0000 0000 0000 0000 0000020 0000 0000 0000 0000 0000 0000 0000 0000 * 4000000

上述命令中,我們使用Python內建的open()函式來得到檔案描述符,並使用f.fileno()來獲取檔案描述符。除此之外,我們也可使用os模組下的open()函式來得到檔案描述符。mmap()函式的第二個引數0表示將整個檔案對映到記憶體,第三個引數mmap.ACCESS_WRITE表示獲取寫許可權。

通過呼叫mmap()函式,我們可以得到mmap的物件m。我們可以利用這個物件m進行類似列表一樣的操作。

注:在mmap()函式中還有一個offset引數,其表示指定對映檔案的某個區域,但其必須是記憶體頁大小的整數倍。

>>> m = mmap.mmap(f.fileno(), mmap.PAGESIZE*8, access=mmap.ACCESS_WRITE, offset=mmap.PAGESIZE*4)
>>> m[:0x1000] = '\xaa' * 0x1000

[email protected] ~/Desktop $ od -x demo.bin 
0000000 0088 0000 0000 0000 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

通過上述操作,我們在記憶體中修改資料的同時也將檔案的資料給修改了。因此,我們達到了將檔案對映到記憶體的目的。

注:本部分內容本人也是有點囫圇吞棗,希望路過的大佬能夠指點迷津,謝謝!

相關推薦

如何檔案對映記憶體

實際案例 在訪問某些二進位制檔案時,希望能把檔案對映到記憶體中,可以實現隨機訪問(如 framebuffer裝置檔案); 某些嵌入式裝置,暫存器被編址到記憶體地址空間,我們可以對映/dev/mem某範圍,去訪問這些暫存器; 如果多個程序對映

轉: mmap檔案對映記憶體分析

主要是瞭解mac下vmmap命令配合使用情況,mmap記憶體對映對應java nio的RandomAccessFile的FileChannel進行map()操作。 public class RandomMapFileReadTest { s

使用SQLXMLXML檔案對映到關係資料庫

1. My Computer-->System Properties-->Advanced-->Environment Variables add D:/Program Files/Microsoft Visual Studio 8/SDK/v2.0/Bin/ to pa

PE檔案記憶體中的地址對映關係

PE檔案與(虛擬)記憶體中的地址對映 檔案偏移地址 PE檔案中的資料的地址,就是在檔案內部的地址,也可以理解成在檔案系統中相對於檔案頭的偏移地址。在PE檔案內部,資料是按資料節存放的,但每一個數據節都是0x200位元組的倍數,不足的用0x00補齊。 裝載地址(Im

idea打包沒有mybatis對映檔案一起打包的問題

使用IDEA,匯入專案,啟動專案時候,一直報Invalid bound statement異常,專案在eclipse中啟動是沒有問題的。懵逼好一會,總歸是見識少,留個筆記記錄下。 IDEA預設只把src/main/resource下的資原始檔打包到classes目錄下,原始

Tomcat中儲存的檔案 對映到磁碟方法?

1.專案部署到tomcat中發現,由於以前的影象儲存及檔案上傳下載都是放在Tomcat中專案的WEB-INF下的upload以及PDF資料夾下,這樣也就導致每次重新部署需要都會將原來的影象覆蓋掉。之前的做法是 先備份這2個資料夾,部署解壓後的war包後 將備份的

C/C++快速讀寫磁碟資料的方法-塊讀取/非同步/優化分析演算法/記憶體檔案對映的原理和使用

快速讀寫磁碟資料的方法: 1.塊讀取:一下子將資料讀取到記憶體的(無論是文字還是二進位制),而不是一行行的讀取。 2.非同步的IO,建立多執行緒,或者使用重疊IO,IO複用,非同步的事件回撥通知機制(可以用事件物件,訊號驅動來實現)。 3.優化分析檔案的演算法和儘量延後分析,分析演算法裡

c#實現記憶體對映檔案共享記憶體

記憶體對映檔案是利用虛擬記憶體把檔案對映到程序的地址空間中去,在此之後程序操作檔案,就像操作程序空間裡的地址一樣了,比如使用c語言的 memcpy等記憶體操作的函式。這種方法能夠很好的應用在需要頻繁處理一個檔案或者是一個大檔案的場合,這種方式處理IO效率比普通IO效率要高

對映檔案記憶體,像操作記憶體一樣方便讀寫檔案——MemFile

編碼中操作檔案是常有的事,本文封裝了一種不一樣的讀寫檔案方式,通過對映檔案可以想操作記憶體一樣方便的讀寫檔案。 方法解釋: Attach:關聯已存在的檔案並對映到記憶體,不存在返回NULL; Detach:取消關聯機器對映; Alloc:建立一個新的檔案並對映到記憶體; C

記憶體檔案對映原理和簡單應用

參考部落格:http://blog.csdn.net/haiross/article/details/46875211 參考部落格:http://blog.csdn.net/mg0832058/ar

Linux下C程式設計-----IO/檔案操作/記憶體對映 實現簡單記錄儲存(3)

利用linux下的檔案記憶體對映可以實現程序共享資料,我們可以把一個檔案對映到虛擬記憶體中使多個程序進行共享, 到這裡我們大概能想到他能應用到的領域 是很廣泛的  主要涉及到 mmap  munmap   msync 三個函式的應用 下面貼程式碼  下面一段程式碼是為檔案

Linux基礎之虛擬記憶體檔案對映mmap

mmap概念   mmap是一種記憶體對映檔案的方法,即將一個檔案或者其它物件對映到程序的地址空間,實現檔案磁碟地址和程序虛擬地址空間中一段虛擬地址的一一對映關係。   特點:實現這樣的對映關係後,

程序間通訊——記憶體對映/檔案對映形式

記憶體對映/檔案對映形式下的程序交通訊不分32位還是64位,是因為本質上使用的是系統物理頁面(系統位數)。 主要是三個函式:CreateFileMapping;MapViewOfFile(對映記憶體)

程序地址空間和記憶體檔案對映

程序地址空間 每個程序都有自己的地址空間。對32位程序來說,由於32位指標可以表示從0x00000000到0xFFFFFFFF之間的任一值,地址空間的大小為4GB。對64位程序來說,由於64位指標可以表示從0x00000000'00000000到0xFFFFFFFF'FFF

HDFS中的檔案對映為Hive中的表

上一篇文章中已經將伺服器本地檔案上傳到HDFS指定資料夾中,現在要將檔案中的內容存入Hive對應的表中,步驟如下。 su hive //切換到hive使用者 create table tes

C/C++(5)實現大資料檔案記憶體對映機制

摘要 本文主要講述大量資料的檔案的記憶體對映機制的實現。 1. 記憶體對映 記憶體對映檔案,是由一個檔案到一塊記憶體的對映。Win32提供了允許應用程式把檔案對映到一個程序的函式 (CreateFileMapping)。記憶體對映檔案與虛擬記憶體有些類似,通過記憶體對映檔

Java NIO 檔案IO-記憶體對映檔案MappedByteBuffer與zerocopy

在傳統的檔案IO操作中,我們都是呼叫作業系統提供的底層標準IO系統呼叫函式read()、write() ,此時呼叫此函式的程序(在JAVA中即java程序)由當前的使用者態切換到核心態,然後OS的核心程式碼負責將相應的檔案資料讀取到核心的IO緩衝區,然後再把資料

匯出記憶體映象檔案記憶體異常分析(MAT工具)

記憶體溢位自動匯出引數: //發生溢位時dump出來 -XX:+HeapDumpOnOutOfMemoryError //dump的路徑 ./為專案啟動根路徑 -XX:HeapDumpPath=./ 記憶體溢位手動匯出引數:jmap命令使用 jdk安裝後會自帶一些小工具,jmap

使用git檔案上傳到碼雲

初始化步驟 1.安裝git https://git-scm.com/downloads/ 2.新建一個資料夾,右鍵Git Bash Here,彈出命令視窗 3.輸入git init,生成.git資料夾 4.配置使用者資訊 git config user.name 使

Springboot配置檔案對映

新增類和配置檔案的對映: 1.定義對映類 @Component @PropertySource("classpath:config/XX.properties") public class ConfigClass{   @Value("$name")   public String userNam