大家下午好,我們正在使用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