記憶體對映對於大檔案的使用

2021-05-25 04:41:34 字數 758 閱讀 9252

平時很少使用大檔案的記憶體對映,碰巧遇到了這樣的要求,所以把過程記錄下來,當給各位乙個引子吧,因為應用不算複雜,可能有考慮不到的地方,歡迎交流。

對於一些小檔案,用普通的檔案流就可以很好的解決,可是對於超大檔案,比如2g或者更多,檔案流就不行了,所以要使用api的記憶體對映的相關方法,即使是記憶體對映,也不能一次對映全部檔案的大小,所以必須採取分塊對映,每次處理一小部分。

先來看幾個函式

createfile :開啟檔案

getfilesize : 獲取檔案尺寸

mapviewoffile :對映檔案

看mapviewoffile的幫助,他的最後兩個引數都需要是頁面粒度的整數倍,一般機器的頁面粒度為64k(65536位元組),而我們實際操作中,一般都不是這樣規矩的,任意位置,任意長度都是可能的,所以就要做一些處理。

本例的任務是從乙個長度列表中(finfolist),依次讀取長度值,然後到另外乙個大檔案(fsourcefilename)中去順序讀取指定長度的資料,如果是小檔案,這個就好辦了,一次讀到檔案流中,然後依次讀取就是了,大數對於大檔案,就需要不斷改變對映的位置,來取得我們想要的資料。

本例中顯示先通過getsysteminfo來獲取頁面粒度,然後以10倍的頁面粒度為乙個對映資料塊,在for迴圈中,會判斷已經讀取的長度(totallen)加上即將讀取的長度,是否在本次對映範圍之內(10倍的頁面粒度),如果在就繼續讀取,如果超出了,就要記下剩下的資料,然後重新對映下一塊記憶體,並將記錄下的剩餘資料合併到新讀取的資料中,有點繞啊(可能是我的想法太繞了),下面列出**。

使用記憶體對映檔案處理大檔案示例

前面我們講過記憶體對映檔案的使用,但是,如果檔案大小超過記憶體大小那怎麼辦呢 其實,我們在把記憶體對映檔案對映到程序的位址空間時,可以對映一部分,通過乙個迴圈,把整個檔案處理完 下面我舉個例子 include include include using namespace std int64 cou...

大檔案處理 記憶體檔案對映

記憶體對映檔案,是由乙個檔案到一塊記憶體的對映。與虛擬記憶體有些類似,通過記憶體對映檔案可以保留乙個位址空間的區域,同時將物理儲存器提交給此區域,記憶體檔案對映的物理儲存器來自乙個已經存在的磁碟上的檔案,而且在對該檔案進行操作之前必須首先對檔案進行對映。另外,記憶體對映檔案是由乙個檔案到程序位址空間...

VC 中使用記憶體對映檔案處理大檔案

vc 中使用記憶體對映檔案處理大檔案 摘要 本文給出了一種方便實用的解決大檔案的讀取 儲存等處理的方法,並結合相關程式 對具體的實現過程進行了介紹。引言 檔案操作是應用程式最為基本的功能之一,win32 api和mfc均提供有支援檔案處理的函式和類,常用的有win32 api的createfile ...