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

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

快速讀寫磁碟資料的方法:

1.塊讀取:一下子將資料讀取到記憶體的(無論是文字還是二進位制),而不是一行行的讀取。

2.非同步的IO,建立多執行緒,或者使用重疊IO,IO複用,非同步的事件回撥通知機制(可以用事件物件,訊號驅動來實現)。

3.優化分析檔案的演算法和儘量延後分析,分析演算法裡面頻繁的申請字串記憶體和釋放字串記憶體,儘量用指標解析出來,分析檔案的內容可以延期到使用的時候才分析。

如果不注意,不小心 ,讀取檔案的主要效能消耗將會在這裡,所以需要特別高的重視。

4.使用記憶體檔案對映, window是CreateFileMapping,MapViewOfFile,UnmapViewOfFile,CloseHandle;linux是用mmap,munmap,msync,free。

記憶體檔案對映的使用:

  (1)大資料量檔案的讀取,有效的提高磁碟和記憶體間資料通訊的效能;

  (2)程序間快速的共享記憶體,實現程序間高效的通訊。


記憶體對映檔案效能高於普通IO的原因:

記憶體檔案對映和普通的檔案IO都是要通過檔案系統和硬碟驅動拷貝資料到記憶體中,記憶體檔案對映資料越大越快主要是:

(1)實際拷貝資料前,需要建立對映資訊,記憶體檔案對映已經提前準備好了對映關係,核心排程好了程序內的記憶體塊,交付給核心進行了預先處理,記憶體檔案對映會消耗掉一些時間。

(2)實際拷貝時候,記憶體檔案對映將磁碟資料直接拷貝到使用者程序記憶體空間只進行了一次拷貝,而普通的IO是先將檔案拷貝到核心快取空間,然後才拷貝到使用者程序記憶體空間,進行了兩次拷貝。

下面是一個使用普通的fread函式和記憶體對映檔案函式,讀取不同大小的磁碟檔案的效能分析表:

檔案大小(KB)

I/O函式讀取時間(ms)

記憶體對映讀取時間(ms)

綜合:當讀寫磁碟檔案的資料較小(少於1MB)時候,使用記憶體檔案對映和普通IO是差異很小的,所以建議使用普通IO就可以了;當很多檔案的大小在幾十MB, 幾百MB, 或者1GB以上的檔案資料需要進行較頻繁的訪問,或者一開始需要全部載入這些大檔案的時候,那麼就需要考慮使用記憶體檔案映射了。