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函數和內存映射文件函數,讀取不同大小的磁盤文件的性能分析表:

對比圖


綜合:當讀寫磁盤文件的數據較小(少於1MB)時候,使用內存文件映射和普通IO是差異很小的,所以建議使用普通IO就可以了;當很多文件的大小在幾十MB, 幾百MB, 或者1GB以上的文件數據需要進行較頻繁的訪問,或者一開始需要全部加載這些大文件的時候,那麼就需要考慮使用內存文件映射了。
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章