基于Windows的文件内存映射关闭耗时的大问题!

_nodouble_ 2017-05-03 11:06:58
处理一个大文件,大概1G及以上,使用windows api进行文件内存映射,写入数据后关闭映射,结果关闭时间需要5秒左右,气死人!

我的做法是:创建一个文件,得到一个handle,名为h_file, 使用这个h_file创建一个映射对象,得到另一个handle,名为h_map;
写入数据后,调整文件长度(调用SetFilePointer和SetEndOfFile),然后关闭h_map(瞬间关闭),最后关闭h_file(耗时5秒左右),这到底是怎么一回事呢?

A:如果我创建完成h_map之后就立即关闭h_file,这时候就瞬间完成,但是无法调整文件长度。如果在A的情况下,关闭h_map之后再重新创建文件句柄,然后再去调整文件长度后进行关闭,但这样的话,创建文件句柄又会花费平均5秒左右的时间,真是见鬼了!

请问大侠,我如此才能实现调整文件长度后瞬间关闭所有handle呢?
...全文
277 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
_nodouble_ 2017-07-04
  • 打赏
  • 举报
回复
用 truncate 函数
_nodouble_ 2017-05-05
  • 打赏
  • 举报
回复
引用 2 楼 paschen 的回复:
按理应该不至于要5秒的时间 你直接创建时就确定好文件大小,不需之后再SetFilePointer和SetEndOfFile了
我是直接处理原文件,处理完成后的数据比原文件的数据要小,所以需要调整文件长度。
paschen 版主 2017-05-03
  • 打赏
  • 举报
回复
按理应该不至于要5秒的时间 你直接创建时就确定好文件大小,不需之后再SetFilePointer和SetEndOfFile了
赵4老师 2017-05-03
  • 打赏
  • 举报
回复
摒弃文件内存映射,使用文件读写模拟内存读写。 容量大小从小到大:栈≤全局数据≤堆≤文件≤硬盘≤磁盘阵列≤云存储 当程序需要使用比如2GB~1TB左右的存储时,最简单的办法恐怕得是用文件读写模拟内存读写了吧。windows参考_fseeki64函数,linux参考fseeko64函数。
FILE *fA;fA=fopen("A","rb+");_fseeki64(fA,10000000000i64*sizeof(int),SEEK_SET);fputc(fA,0);//int A[10000000000];
int B;
_fseeki64(fA,9999999999i64*sizeof(int),SEEK_SET);fread(&B,1,sizeof(int),fA);//B=A[9999999999];
_fseeki64(fA,9999999999i64*sizeof(int),SEEK_SET);fwrite(&B,1,sizeof(int),fA);//A[9999999999]=B;
fclose(fA);
在文件大小相同的前提下: 读刚读过的文件比头次读没读过的文件快 读转速快的硬盘上的文件比读转速慢的硬盘上的文件快 读没有磁盘碎片的文件比读有磁盘碎片的文件快 读文件不处理比边读边处理快 单线程从头到尾一次读文件比多线程分别读文件各部分快(非固态硬盘上) 读固态硬盘上的文件比读普通硬盘上的文件快 写类似。 您是否希望迅速对您频繁使用的文件进行碎片整理?使用 Contig 优化单个的文件,或者创建连续的新文件。http://technet.microsoft.com/zh-cn/sysinternals/bb897428

64,683

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧