C/C++快速读写磁盘数据的方法-块读取/异步/优化分析算法/内存文件映射的原理和使用
2015-03-08 18:18
591 查看
快速读写磁盘数据的方法:
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以上的文件数据需要进行较频繁的访问,或者一开始需要全部加载这些大文件的时候,那么就需要考虑使用内存文件映射了。
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函数和内存映射文件函数,读取不同大小的磁盘文件的性能分析表:
文件大小(KB) | I/O函数读取时间(ms) | 内存映射读取时间(ms) |
5.56 | 0 | 47 |
56 | 31 | 47 |
508 | 94 | 47 |
4597.76 | 811 | 47 |
47820.8 | 7348 | 78 |
209920 | 31403 | 218 |
510976 | 72977 | 436 |
相关文章推荐
- C/C++快速读写磁盘数据的方法-块读取/异步/优化分析算法/内存文件映射的原理和使用
- 内外网互通,内外网数据交换,全端口映射的技术原理与实际使用方法
- Java网络编程从入门到精通(34):读写缓冲区中的数据---使用get和put方法按顺序读写单个数据 推荐
- Java网络编程从入门到精通(34):读写缓冲区中的数据---使用get和put方法按顺序读写单个数据
- mhdd扫描磁盘坏道快速使用方法
- unix/linux下线程私有数据实现原理及使用方法
- 使用C++读取UTF8及GBK系列的文本方法及原理
- Java网络编程从入门到精通(34):读写缓冲区中的数据---使用get和put方法按顺序读写单个数据
- unix/linux下线程私有数据实现原理及使用方法
- OJ常用动态数据输入方法 C++简单的栈编写及使用
- Java网络编程从入门到精通(34):读写缓冲区中的数据---使用get和put方法按顺序读写单个数据
- 直接使用SQL操作Oracle空间数据的原理以及配置方法
- 难点总结:Jquery动态加载数据库中的数据(解答人:郭哲 方式:讲述jquery原理及一些函数的使用方法,学会看帮助文档)
- Struts:把页面数据提交到Form的原理及使用方法
- unix/linux下线程私有数据实现原理及使用方法
- 直接使用SQL操作Oracle空间数据的原理以及配置方法
- C/C++ 数据类型的使用方法详解
- 使用CreateFile, ReadFile, WriteFile在Windows NT/2000/XP下读写绝对扇区的方法 分类: 磁盘的扇区读写 2015-04-29 10:50 358人阅读 评论(0) 收藏
- php使用fputcsv()函数csv文件读写数据的方法
- IO中使用缓冲读写操作控制台数据的newLine()方法