關於檔案讀寫 Linux的記憶體對映解決大檔案讀寫

2021-06-08 21:39:26 字數 954 閱讀 4614

第一組:ifstream與cfile的效率

from:

ifstream是標準c++中的檔案輸入流,在實際應用中,用它的read方法,是必須緩衝的,效率很低。

在一次測試中,用它將乙個800k的檔案一次讀入字串中,和

mfc中的cfile類的read方法,效率竟然相差七倍,我用的是vc8,wm5.0的平台,用cfile,不到一秒,用ifstream要快七秒。究其原因,還是兩者的機制不同所致。

ifstream的read、write方法,都是要緩衝的,所謂的緩衝區其實是一段中介記憶體(臨時儲存區),如果使用者不設定的話,一般是512位元組,讀或寫時先要將資料輸送到緩衝區,等到緩衝區滿或被重新整理時,才將資料傳輸到裝置或檔案中。要直接讀到記憶體中(即所謂的核心格式化),要用istringstream類。cfile顯然是直接讀記憶體不需要緩衝,所以速度快。

如果不考慮效率,可以用標準c++的檔案輸出流,二者的區別檔案越大越明顯,所以要根據實際運用的需要來選擇。c++的靈活性在於它的概念是在實際中體會的,理論也是在實際應用中深化的。

第二組:linux記憶體對映:mmap

linux提供了記憶體對映函式mmap, 它把檔案內容對映到一段記憶體上(準確說是虛擬記憶體上), 通過對這段記憶體的讀取和修改,實現對檔案的讀取和修改, 先來看一下mmap的函式宣告:

原型: void *mmap(void *addr, size_t length, int prot, int flags,int fd, off_t offsize);

返回值: 成功則返回對映區起始位址, 失敗則返回map_failed(-1).

引數:flags: 對映區的特性, 可以是:

fd: 由open返回的檔案描述符, 代表要對映的檔案.

offset: 以檔案開始處的偏移量, 必須是分頁大小的整數倍, 通常為0, 表示從檔案頭開始對映.

下面說一下記憶體對映的步驟:

關於檔案在記憶體中讀寫的問題

這兩天遇到乙個算不上bug的問題,主要涉及到檔案的讀寫。資料庫表中有大量資料,可能不停的寫入資料,又要從該表中讀取未讀取的資料,所以每次從表中讀取完資料,將最後一條資料的id寫入到乙個檔案中,這樣下次讀取資料不需要從表的開頭讀取,可以永久的儲存記錄。下面是乙個測試程式 int count 0 whi...

c語言學習筆記 記憶體管理 linux的記憶體映像

程式在記憶體中的儲存形式 程式儲存在flash中 程式在記憶體中主要分為以下幾段 段,資料段,唯讀資料段,bss段,堆,棧,檔案對映區,核心對映區 作業系統核心 程式一般存放在 段,在linux中又稱為文字段 資料段存放的一般是靜態變數和被初始化為非零值的全域性變數 bss段存放的是被初始化為零的全...

Linux讀寫物理記憶體

1 開啟裝置檔案 mem是乙個字元裝置檔案,是計算機主存的乙個映像。通常只有root使用者對其有讀寫許可權。因此只有root使用者能進行這些操作。如果要開啟裝置檔案 dev mem,需要系統呼叫open 函式,作用是開啟乙個檔案或裝置,其函式原型為 int open const char path,...