内存映射对于大文件的使用
来源:互联网 发布:运营美工推广招聘 编辑:程序博客网 时间:2024/05/21 20:33
平时很少使用大文件的内存映射,碰巧遇到了这样的要求,所以把过程记录下来,当给各位一个引子吧,因为应用不算复杂,可能有考虑不到的地方,欢迎交流。
对于一些小文件,用普通的文件流就可以很好的解决,可是对于超大文件,比如2G或者更多,文件流就不行了,所以要使用API的内存映射的相关方法,即使是内存映射,也不能一次映射全部文件的大小,所以必须采取分块映射,每次处理一小部分。
先来看几个函数
CreateFile :打开文件
GetFileSize : 获取文件尺寸
CreateFileMapping :创建映射
MapViewOfFile :映射文件
看MapViewOfFile的帮助,他的最后两个参数都需要是页面粒度的整数倍,一般机器的页面粒度为64k(65536字节),而我们实际操作中,一般都不是这样规矩的,任意位置,任意长度都是可能的,所以就要做一些处理。
本例的任务是从一个长度列表中(FInfoList),依次读取长度值,然后到另外一个大文件(FSourceFileName)中去顺序读取指定长度的数据,如果是小文件,这个就好办了,一次读到文件流中,然后依次读取就是了,大数对于大文件,就需要不断改变映射的位置,来取得我们想要的数据。
本例中显示先通过GetSystemInfo来获取页面粒度,然后以10倍的页面粒度为一个映射数据块,在for循环中,会判断已经读取的长度(totallen)加上即将读取的长度,是否在本次映射范围之内(10倍的页面粒度),如果在就继续读取,如果超出了,就要记下剩下的数据,然后重新映射下一块内存,并将记录下的剩余数据合并到新读取的数据中,有点绕啊(可能是我的想法太绕了),下面列出代码。
- 内存映射对于大文件的使用
- delphi:内存映射对于大文件的使用--copy from bdmh
- 使用内存映射文件加快读取大文件的速度 .
- 使用内存映射文件处理大文件
- 使用内存映射文件读写大文件
- 使用内存映射文件处理大文件
- 使用内存映射文件读写大文件
- 使用内存映射文件读写大文件
- Java使用内存映射实现大文件的上传
- Java使用内存映射实现大文件的上传
- Java使用内存映射实现大文件的上传
- 内存映射文件的使用
- 大数据量文件的内存映射
- Windows的内存映射,大文件读写
- VC++中使用内存映射文件处理大文件
- VC++中使用内存映射文件处理大文件
- VC++中使用内存映射文件处理大文件
- VC++中使用内存映射文件处理大文件
- (转)简体繁体转换代码(Big5-GB | GBK简体-GBK繁体)
- QT中线程调用GUI主线程控件的问题
- SVN服务器的简单配置
- 今天的问题总结
- 1. js的控件分析
- 内存映射对于大文件的使用
- setTimeout与setInterval
- Android 菜单(OptionMenu)大全
- MFC中句柄寻找
- 修改PDF事件链接
- 文件指针过多没关,会导致文件打开失败
- hdu 3466(背包变形)
- Outlook 2003/2007共享和打开其他用户的文件夹
- 上传文件呢