下午好,我们正在使用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);在我们的重复数据删除过程的随机访问阶段,我们是否通过使用FILE_FLAG_SEQUENTIAL_SCAN在Windows中付出了代价?谢谢。
发布于 2011-05-17 08:17:03
传递给CreateFile()的缓存提示标志不会影响内存管理器满足页面错误的方式,页面错误是通过取消引用映射节中的地址而生成的。这样的I/O使用相同的-它们使用与常规I/O相同的缓存页。
也就是说,当使用FILE_FLAG_SEQUENTIAL_SCAN创建文件句柄时,缓存管理器可以执行预读操作(如果系统条件允许,甚至可以将整个文件读取到内存中)。这意味着,如果您按顺序访问映射文件的页面,您可能会遇到较少的硬页面错误。
在我看来,最好的服务方式是重用您在去重处理过程中创建的句柄。根据缓存压力的不同,关闭和重新打开可能会导致先前缓存的文件页面被丢弃。
发布于 2011-05-17 00:53:52
有关FILE_FLAG_SEQUENTIAL_SCAN工作原理的说明可在此处找到:http://support.microsoft.com/kb/98756
因为它只与CreateFile函数一起使用,所以一旦打开文件,就无法对其进行更新。您可以随时关闭该文件,然后使用不同的标志重新打开它。
发布于 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:
注意:这些缓存提示仅在您使用ReadFile (或道德等效项)时适用。内存映射文件访问不会通过缓存管理器,因此这些缓存提示不起作用。
因此,已经缓存的内容可能会有所帮助,但未来的内存映射访问将无助于填充/取消填充缓存。
https://stackoverflow.com/questions/6020640
复制相似问题