大家下午好,我们正在使用Windows和Linux的内存映射文件API来构建一个Windows/LINUX演示程序的原型。我们的扣除器通过对要删除的所有数据库记录进行顺序扫描开始。因此,在我们对要被重复删除的数据库记录进行初始顺序扫描期间,我们将标志FILE_FLAG_SEQUENTIAL_SCAN传递给Windows API CreateFile。 一旦我们完成了我们的重复数据删除过程的第一部分,我们尝试使用Windows内存映射API来随机访问数据。此时,使用Windows C++ API,是否可以动态更改为FILE_FLAG_RANDOM_ACCESS模式?是否可以从FILE_FLAG_SEQUENTIAL_SCAN动态更改为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);
我们是通过在我们的重复数据删除过程中的随机访问阶段使用FILE_FLAG_SEQUENTIAL_SCAN付罚款在Windows中。谢谢。
谢谢你的回答。我刚接受你的回答。我将更改我们的代码以重用我们在重复数据删除处理期间创建的句柄。我们注意到,当使用FILE_FLAG_SEQUENTIAL_SCAN创建文件句柄时,我们顺序访问映射文件的页面时会遇到更少的硬页面错误。这是否意味着我们在重复数据删除处理期间不尝试使用FILE_FLAG_RANDOM_ACCESS?谢谢。 – Frank 2011-05-17 05:52:09
@Frank - 您的里程可能会有所不同。当指定FILE_FLAG_RANDOM_ACCESS时,对于句柄将禁用预读。此外,缓存管理器在取消映射先前访问过的文件页面时不那么积极 - 这里的想法是在应用程序重新访问页面时最小化文件的映射/解映射事件。 – Bukes 2011-05-17 18:06:37
谢谢你的回答。我想我们会尝试使用CreateFile(...,FILE_FLAG_RANDOM_ACCESS)运行我们的重复数据删除应用程序,以便在重复访问重复页面时尽量减少内存映射文件的映射/解映射事件。看到结果应该很有趣。谢谢。 – Frank 2011-05-18 01:43:58