从fread和mmap谈C++读文件的性能
来源:互联网 发布:航班动态查询软件 编辑:程序博客网 时间:2024/05/29 09:40
(关于Linux读文件的更深入理解,猛戳这里吧)
在进行大规模数据处理时,读文件很有可能成为速度瓶颈。不管你的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的读取速率。
这时file.txt文件中的数据就可以从data指针指向的首地址开始访问了。
作者:jiang1st
在进行大规模数据处理时,读文件很有可能成为速度瓶颈。不管你的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指针指向的首地址开始访问了。
为了从数据说明这个问题,我引用一位网友的结论,希望对大家有所启发。
作者:jiang1st
转载此文请注明出处:http://blog.csdn.net/jiang1st2010
- 从fread和mmap谈C++读文件的性能
- 从fread和mmap 谈读文件的性能
- C文件流操作的fread和fseek
- file_get_contents和fread的性能差别
- C语言fread()函数:读文件函数(从文件流读取数据)
- C标准IO的fread和fwrite
- linux c之用fwrite和fread实现文件的复制
- C语言文件流操作的二进制读写和定位(fwrite、fread、fseek)
- C 语言 fwrite 和 fread 文件读写操作示例
- c语言fwrite和fread连续读写文件流
- fread读取文件读不全的问题解决
- C语言文件流关于fread,fwrite多读的问题(yuxinsong)
- C/C++文件的操作(fread() fwrite())
- fread-C语言是怎样读取文件的
- C/C++文件的操作(fread() fwrite())
- malloc 和 mmap 的内存,到底哪个性能好?
- LINUX 环境下 NIO MMAP和DirectMem性能的比较
- fstream与 C 风格(例如fread 和 fwrite )两种读写文件方法的效率比较
- 黑马程序员--.Net学习日记——WinForm
- java异常处理——throw与throws的区别
- Jquery上传插件 uploadify v3.1使用说明
- 算法设计与分析课程Part1笔记(3)
- 雨天好睡觉
- 从fread和mmap谈C++读文件的性能
- jquery调用webservices注意事项
- HTML5中快速运用Google Maps JavaScript API V3
- 简单模拟Comparator-策略设计模式-马士兵设计模式教程
- js中 如何声明隐式全局作用域变量
- ORACLE常见数据类型详解
- 黑马程序员--.Net学习日记——C#编程基础
- cocos2d-x选择之路(二):搭建xcode开发环境
- HttpModule的认识