下午好,我们正在使用Windows和Linux的内存映射文件API构建Windows/LINUX重复数据删除器的原型(prototype)。我们的重复数据删除器通过对要重复数据删除的所有数据库记录进行顺序扫描而开始。因此,在对要删除重复数据的数据库记录进行初始顺序扫描期间,我们将标志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);
在重复数据删除过程的随机访问阶段,我们是否通过使用FILE_FLAG_SEQUENTIAL_SCAN在Windows中支付了罚款?谢谢你。
最佳答案
传递给CreateFile()的缓存提示标志不会影响内存管理器满足通过取消引用映射部分中的地址而生成的页面错误的方式。这样的I/O使用相同的-与常规I/O使用相同的缓存页面。
也就是说,当使用FILE_FLAG_SEQUENTIAL_SCAN创建文件的句柄时,高速缓存管理器可以执行预读操作(如果系统条件允许,甚至可以将整个文件读入内存)。这意味着,如果您顺序访问映射文件的页面,则可能会遇到较少的硬页面错误。
在我看来,只需重新使用在重复数据删除处理过程中创建的句柄,便可以为您提供最好的服务。关闭和重新打开可能会导致文件的先前缓存页面被丢弃,具体取决于缓存压力。