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

2021-07-14 04:15:32 字數 674 閱讀 6849



原文:hongchangfirst

hongchangfirst的主頁:

先說結論:使用記憶體對映檔案來處理大檔案可以提高效率。 

為什麼呢?

我們先來看看如果不使用記憶體對映檔案的處理流程是怎樣的,首先我們得先讀出磁碟檔案的內容到記憶體中,然後修改,最後回寫到磁碟上。第一步讀磁碟檔案是要經過一次系統呼叫的,它首先將檔案內容從磁碟拷貝到核心空間的乙個緩衝區,然後再將這些資料拷貝到使用者空間,實際上是兩次資料拷貝。第三步回寫也一樣也要經過兩次資料拷貝。

所以我們基本上會有四次資料的拷貝了,因為大檔案資料量很大,幾十gb甚至更大,所以拷貝的開銷是非常大的。

而記憶體對映檔案是作業系統的提供的一種機制,可以減少這種不必要的資料拷貝,從而提高效率。它由mmap()將檔案直接對映到使用者空間,mmap()並沒有進行資料拷貝,真正的資料拷貝是在缺頁中斷處理時進行的,由於mmap()將檔案直接對映到使用者空間,所以中斷處理函式根據這個對映關係,直接將檔案從硬碟拷貝到使用者空間,所以只進行了一次資料拷貝 ,比read進行兩次資料拷貝要好上一倍,因此,記憶體對映的效率要比read/write效率高。

一般來說,read write操作可以滿足大多數檔案操作的要求,但是對於某些特殊應用領域所需要的幾十gb甚至更大的儲存,這種通常的檔案處理方法進行處理顯然是行不通的。目前,對於上述大檔案的操作一般是以記憶體對映檔案的方式來加以處理的。

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

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

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

引言 檔案操作是應用程式最為基本的功能之一,win32 api和mfc均提供有支援檔案處理的函式和類,常用的有win32 api的createfile writefile readfile 和mfc提供的cfile類等。一般來說,以上這些函式可以滿足大多數 場合的要求,但是對於某些特殊應用領域所需要...

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

檔案操作是應用程式最為基本的功能之一,win32 api和mfc均提供有支援檔案處理的函式和類,常用的有win32 api的createfile writefile readfile 和mfc提供的cfile類等。一般來說,以上這些函式可以滿足大多數場合的要求,但是對於某些特殊應用領域所需要的動輒幾...