首页
社区
课程
招聘
[已解决] [悬赏]基于Windows的文件内存映射关闭耗时的大问题! 5.00雪花
发表于: 2017-5-10 15:32 3087

[已解决] [悬赏]基于Windows的文件内存映射关闭耗时的大问题! 5.00雪花

2017-5-10 15:32
3087

处理一个大文件,大概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呢?


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 1787
活跃值: (340)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
这有什么见鬼的,你换个SSD,速度就上去了,写1G文件,需要时间啊。你硬盘又没那么快。
2017-5-10 18:14
0
雪    币: 49
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
加SSD,在搞个阵列。哈哈。速度呼呼的快。
2017-5-10 18:30
0
雪    币: 115
活跃值: (46)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
4
如果所在卷是NTFS格式,且单次写入数据量少的话,试试为文件设置标志位FSCTL_SET_SPARSE
2017-5-10 22:00
0
雪    币: 6
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
哈哈,都是高手啊
2017-5-10 22:37
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
IDGHOST 如果所在卷是NTFS格式,且单次写入数据量少的话,试试为文件设置标志位FSCTL_SET_SPARSE
如果不调整文件长度的话,关闭就瞬间完成,所以我感觉不是写入数据量大小的问题
2017-5-11 14:15
0
雪    币: 115
活跃值: (46)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
7
因为在关闭时候总还是要把数据写回去,SetFilePointer也不例外(占硬盘空间)。
我所理解的意思是:1.1G的文件只写数据,卡。2.小文件只调整到1G,卡。
那么很简单,①用非缓存打开②调整不同文件大小比较等待时间③追踪那段时间硬盘的写入量。
至于调整大小卡的原因当然也有可能是磁盘碎片的缘故。
2017-5-11 18:28
0
游客
登录 | 注册 方可回帖
返回
//