首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以从FILE_FLAG_SEQUENTIAL_SCAN动态切换到FILE_FLAG_RANDOM_ACCESS?

是否可以从FILE_FLAG_SEQUENTIAL_SCAN动态切换到FILE_FLAG_RANDOM_ACCESS?
EN

Stack Overflow用户
提问于 2011-05-17 00:48:44
回答 3查看 1.2K关注 0票数 3

下午好,我们正在使用Windows和Linux的内存映射文件API构建一个Windows/LINUX重复数据删除程序的原型。我们的重复数据删除程序首先对要删除重复数据的所有数据库记录进行顺序扫描。因此,在对要进行重复数据删除的数据库记录进行初始顺序扫描期间,我们将标志FILE_FLAG_SEQUENTIAL_SCAN传递给Windows API CreateFile。完成重复数据消除过程的第一部分后,我们尝试使用Windows内存映射API随机访问数据。此时,使用Windows C++ API,是否可以动态切换到FILE_FLAG_RANDOM_ACCESS模式?

代码语言:javascript
复制
In Linux, we are are able to do this with the following excerpt of code, 
  MapPtr = (char*)mmap((void *)BaseMapPtr ,mappedlength,PROT_READ, 
            MAP_PRIVATE,  hFile,baseoff );
                    if (MapPtr == MAP_FAILED){
                        perror("mmap");
                        throw cException(ERR_MEMORYMAPPING,TempFileName);
                    }
 madvise(MapPtr,mappedlength,MADV_RANDOM);

在我们的重复数据删除过程的随机访问阶段,我们是否通过使用FILE_FLAG_SEQUENTIAL_SCAN在Windows中付出了代价?谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-05-17 08:17:03

传递给CreateFile()的缓存提示标志不会影响内存管理器满足页面错误的方式,页面错误是通过取消引用映射节中的地址而生成的。这样的I/O使用相同的-它们使用与常规I/O相同的缓存页。

也就是说,当使用FILE_FLAG_SEQUENTIAL_SCAN创建文件句柄时,缓存管理器可以执行预读操作(如果系统条件允许,甚至可以将整个文件读取到内存中)。这意味着,如果您按顺序访问映射文件的页面,您可能会遇到较少的硬页面错误。

在我看来,最好的服务方式是重用您在去重处理过程中创建的句柄。根据缓存压力的不同,关闭和重新打开可能会导致先前缓存的文件页面被丢弃。

票数 5
EN

Stack Overflow用户

发布于 2011-05-17 00:53:52

有关FILE_FLAG_SEQUENTIAL_SCAN工作原理的说明可在此处找到:http://support.microsoft.com/kb/98756

因为它只与CreateFile函数一起使用,所以一旦打开文件,就无法对其进行更新。您可以随时关闭该文件,然后使用不同的标志重新打开它。

票数 3
EN

Stack Overflow用户

发布于 2017-09-04 14:19:21

只需备份@Burkes回答:正如您提到的“使用Windows的内存映射文件API”,应该注意到Raymond Chen warns the cache hints have no affect on effect on memory mapped I/O

注意:这些缓存提示仅在您使用Read­File (或道德等效项)时适用。内存映射文件访问不会通过缓存管理器,因此这些缓存提示不起作用。

因此,已经缓存的内容可能会有所帮助,但未来的内存映射访问将无助于填充/取消填充缓存。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6020640

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档