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的使用方法如下:
-
char *data = NULL;
-
int fd=open(“file.txt”,O_RDONLY);
-
long size = lseek(fd, 0, SEEK_END);
-
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下檔案讀取效能比較(fread、read、mmap)
在進行大規模資料處理時,讀檔案很有可能成為速度瓶頸。不管你的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不同,其後臺執行著許多程序,所以強制關機可能會導致
Linux下docker1.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 下檔案同步函式(fflush、sync、fsync、fdatasync)之間差異
遇到機器異常關機時,寫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下檔案和目錄的壓縮和解壓(gzip、bzip2、tar)
檔案的壓縮和解壓: 注意:區分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
Linux下MySQL主從復制(二)
mysql 鄰居 MySQL的一主多從模式原理結構圖配置步驟1.主服務器: 1. 改變server id 2. 啟用二進制日誌文件 3. 創建具有復制的用戶123123具體操作請看:http://www.crazyrui.pw:8088/index.php/2017/07/23/linux_m