1. 程式人生 > >linux下檔案讀取效能比較(fread、read、mmap)

linux下檔案讀取效能比較(fread、read、mmap)

在進行大規模資料處理時,讀檔案很有可能成為速度瓶頸。不管你的CPU有4個核還是8個核,主頻有2G還是3G,硬碟IO速度總是有個上限的。在本人最近的一次經歷中,對一個11G的文字進行資料處理,一共耗時34.8秒,其中竟然有30.2秒用在訪問IO上,佔了所有時間的87%左右。
        雖然說硬碟IO是有上限的,那麼C++為我們提供的各函式,是否都能讓我們達到這個上限呢?為了求得真相,我對這個11G的文字用fread函式讀取,在linux下用iostat檢查硬碟的訪問速度,發現讀的速度大約在380M/s。然後用dd指令測了一下讀文字的訪問速度,發現速度可以達到460M/s。可見單執行緒fread訪問並沒有達到硬碟的讀取上限。第一次考慮會不會是fread訪問硬碟的時候有一些固定開銷,用多執行緒可以達到流水訪問IO的效果提高讀文字的效率,結果發現多執行緒也只有380M/s的讀取速率。

        為什麼fread的效率達不到最大呢?查閱一些資料才知,用fread/fwrite方式訪問硬碟,使用者須向核心指定要讀多少,核心再把得到的內容從核心緩衝池拷向用戶空間;寫也須要有一個大致如此的過程。這樣在訪問IO的時候就多經歷了這麼一個核心的buffer,造成速度的限制。一個解決的辦法是mmap。mmap就是通過把檔案的某一塊內容直接對映到使用者空間上,使用者可以直接向核心緩衝池讀寫這一塊內容,這樣一來就少了核心與使用者空間的來回拷貝所以通常更快。

        mmap的使用方法如下:

  1. char *data = NULL;

  2. int fd=open(“file.txt”,O_RDONLY);

  3. long size = lseek(fd, 0, SEEK_END);

  4. data = (char *) mmap( NULL, size ,PROT_READ, MAP_PRIVATE, fd, 0 );


        這時file.txt檔案中的資料就可以從data指標指向的首地址開始訪問了。

        為了從資料說明這個問題,我引用一位網友的結論,希望對大家有所啟發。

方法/平臺/時間(秒) Linux gcc Windows mingw Windows VC2008
scanf 2.010 3.704 3.425
cin 6.380 64.003 19.208
cin取消同步 2.050 6.004 19.616
fread 0.290 0.241 0.304
read 0.290 0.398 不支援
mmap 0.250 不支援 不支援
Pascal read 2.160 4.668


作者:jiang1st

相關推薦

linux檔案讀取效能比較freadreadmmap

在進行大規模資料處理時,讀檔案很有可能成為速度瓶頸。不管你的CPU有4個核還是8個核,主頻有2G還是3G,硬碟IO速度總是有個上限的。在本人最近的一次經歷中,對一個11G的文字進行資料處理,一共耗時34.8秒,其中竟然有30.2秒用在訪問IO上,佔了所有時間的87%左右。  

windows檔案路徑與Linux檔案路徑的比較

Windows路徑是我們經常使用的東西,它看似簡單,實際上隱含許多細節,這些都是在平常的使用過程中注意不到的。下面讓我們來看看各種各樣的Windows路徑。 提起路徑,我們都會想到“絕對路徑”和“相對路徑”,實際上絕對路徑是一個廣泛的概念,它表示的是可以唯一定位一個檔案或資

Linux配置MySQL主從同步不復雜,簡單明瞭

明人不說暗話,直接進入正題 一、準備工作 假設兩個伺服器IP如下: 主伺服器:44.92.163.112    -Linux 從伺服器:114.74.22.11     -Linux 注意: 1、主從資料庫版本最好一致; 2、主從資料庫內資料保持一致;

linux 文字操作 快捷鍵持續更新。。。

①  開啟一個終端,新建一個123.txt檔案 命令如下:    touch 123.txt ②  往123.txt輸入如下內容      This is my first C++ program.       Welcome to my world!      H

linux如何執行c++程式包括呼叫外部函式庫

這個問題困擾了我好久,但在網路上搜索很久也沒有找到具體的,條理清晰的一篇。所以,自己動手豐衣足食(拖拖拖了一個月。。) 執行c++程式 事實證明gcc是理解不了c++的。。 用g++執行你的程式,比如:g++ main.cpp g++產生一個.out

Linux qt 程式打包釋出使用linuxdelpoyqt ,shell 指令碼

linux qt 程式打包釋出 1.linuxdeployqt 安裝 最簡單的方法直接下載編譯好的 linuxdeployqt-x86_64.AppImage檔案,將其改名字為linuxdeployqt,並chmod a+x,然後複製到 /usr/loc

linux安裝jdk 詳細步驟一條命令即可安裝

作為Java開發人員,在Linux下安裝一些開發工具是必備技能,本文以安裝jdk為例,詳細記錄了每一步的操作命令,以供參考。 第一種方法 只需要一條命令就可以安裝jdk: yum install java-1.8.0-openjdk* -y執行了這條命令不需要配

Linux關機命令的區別 halt,poweroff,reboot,shutdown,init

在linux下一些常用的關機/重啟命令。 1.shutdown     shutdown命令安全地將系統關機。     有些使用者會使用直接斷掉電源的方式來關閉linux,這是十分危險的。因為linux與windows不同,其後臺執行著許多程序,所以強制關機可能會導致

Linuxdocker1.7.1安裝yum安裝和離線安裝

以下版本的CentOS 支援 Docker : l CentOS 7 (64-bit) l CentOS 6.5 (64-bit) or later 檢視系統版本指令: cat /etc/issue 1.docker 1.7.1安裝 這裡提供兩種安裝方式,yum安裝

linux檔案比較工具diff|cmp使用小結

轉自:http://blog.csdn.net/wangjianno2/article/details/50451737,記錄下便於忘記時查詢。 1.diff diff是Unix系統的一個很重要的工具程式。它用來比較兩個文字檔案的差異,是程式碼版本管理的基石之一。 2.diff使用

linux 檔案同步函式fflushsyncfsyncfdatasync之間差異

遇到機器異常關機時,寫log檔案資訊丟失問題,所以記錄下。   Linux實現中在核心設有緩衝區快取記憶體或頁面快取記憶體,大多數磁碟I/O都通過緩衝區進行。當我們向檔案寫資料時,核心通常先將資料複製到一個緩衝區中,如果該緩衝區尚未寫滿,則並不將其排入輸出佇列,而是等待寫滿或者核心需要重用該

Linux 檔案完全複製屬性不變

在linux中怎樣用命令完全拷貝一個目錄下的所有檔案(包括隱藏檔案以及資料夾)到另外一個目錄下,並且使得被複制的所有檔案的屬性等完全保持不變? 注意,連原來的資料夾中所有的檔案的屬性、連結等都不能更改。也就是說,要建立原來資料夾的一份一模一樣的拷貝!&n在linux

Linux檔案輕鬆比對,自由開源的比較軟體

from : http://www.linuxidc.com/Linux/2015-01/111973.htm Meld Meld是一個適用於Gnome桌面的、開源的、圖形化的檔案差異檢視和合並的應用程式。它支援2到3個檔案的同時比較、遞迴式的目錄比較、處於版

linux檔案和目錄的壓縮和解壓gzipbzip2tar

檔案的壓縮和解壓: 注意:區分Linux系統中檔案和目錄的區別 首先說一下打包和壓縮的概念: 打包是指將一大堆檔案或目錄什麼的變成一個總的檔案; 壓縮則是將一個大的檔案通過一些壓縮演算法變成一個小檔案。 常見的壓縮副檔名: 副檔名

linux部署和執行kettle——配置檔案動態獲取後臺執行

一.部署準備 1.1 java安裝(略) 1.2 JDK配置         1.命令列鍵入“cd /etc”進入etc目錄 2.命令列鍵入“vi profile”開啟profile檔案 3.敲擊鍵盤ctrl+F到檔案末尾 4.在末尾處,即第一個~的地方,敲擊鍵盤

Linux的socket程式設計實踐Unix域協議和socketpair傳遞檔案描述符

UNIX域協議並不是一個實際的協議族,而是在單個主機上執行客戶/伺服器通訊的一種方法,所用API與在不同主機上執行客戶/伺服器通訊所使用的API相同。UNIX域協議可以視為IPC方法之一,Unix域協

Linux 檔案描述符fd檔案指標FILE*

一、檔案描述符(fd) 我們都知道在Linux下一切皆檔案。當然裝置也不例外,如果要對某個裝置進行操作,就不得不開啟此裝置檔案,開啟檔案就會獲得該檔案的檔案描述符fd( file discriptor), 它就是一個很小的整數,每個程序在PCB(Process

Linux基本資料型別大小——int,char,long int,long long int/usr/include/limit.h檔案Linux資料型別的限制及儲存位元組大小的說明

 /* We don't have #include_next.   Define ANSI <limits.h> for standard 32-bit words.  */     /* These assume 8-bit 'char's, 16-bit 'short int's,   an

linux檔案的三個時間Atime ,Mtime,Ctime

在windows系統中建立檔案會儲存檔案有關的三個時間,分別是建立時間,修改時間,訪問時間。 在linux中式怎樣的呢? 我們在linux中新建一個檔案,用stat命令檢視檔案資訊: 系統儲存了這三個時間,分別是Access time(訪問時間),Modify time

LinuxMySQL主從復制

mysql 鄰居 MySQL的一主多從模式原理結構圖配置步驟1.主服務器: 1. 改變server id 2. 啟用二進制日誌文件 3. 創建具有復制的用戶123123具體操作請看:http://www.crazyrui.pw:8088/index.php/2017/07/23/linux_m