是否可以从FILE_FLAG_SEQUENTIAL_SCAN动态更改为FILE_FLAG_RANDOM_ACCESS?

Fra*_*ank 3 c++ linux windows

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

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);
Run Code Online (Sandbox Code Playgroud)

我们是否在我们的重复数据删除过程的随机访问阶段使用FILE_FLAG_SEQUENTIAL_SCAN在Windows中支付罚款.谢谢.

Buk*_*kes 5

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

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

在我看来,只需重复使用您在重复数据删除处理过程中创建的句柄,即可获得最佳服务.关闭和重新打开可能会导致文件的先前缓存页面被丢弃,具体取决于缓存压力.