// Open with FILE_FLAG_NO_BUFFERING
auto hFile = CreateFile(path.c_str(),
GENERIC_READ,
FILE_SHARE_READ,
nullptr,
OPEN_EXISTING,
FILE_FLAG_NO_BUFFERING,
nullptr);
/// Check
if (hFile == INVALID_HANDLE_VALUE){
//_tprintf(TEXT("Terminal failure: unable to open file \"%s\" for read.\n"), argv[1]);
cout << "error" << endl;
return;
}
// Close
CloseHandle(hFile);
// Now open file with regular C++ API, and caching disabled
ifstream file(path, ios::binary | ios::ate);
5条答案
按热度按时间vs91vp4v1#
至少在Windows 7上,尝试在没有 *
FILE_SHARE_WRITE
共享权限**的情况下打开卷句柄 * 似乎会导致文件系统缓存无效***, 即使创建失败 *。因此,我编写了一个程序,它只需要调用
CreateFile
即可。从以下网址下载Base64版本的程序 *:
来源
uqdfh47h2#
我已经编写了一个简单的命令行实用程序来实现这一点:FlushFileCache
它依赖于未记录的NtSetSystemInformation函数,并且还可以刷新各种其他内存池。
rsaldnfx3#
该解决方案非常有效:* 清除文件缓存以重复性能测试 *
更具体地说,我是这样做的:
whitzsjs4#
大卫说的。创建一个大文件,无论你需要多少GB,每次你想重置你的文件缓存时,都要复制一份文件。然后确保你删除了旧文件。
因此,创建BIGFILE1.DAT,将其复制到BIGFILE2.DAT,然后删除BIGFILE1.DAT(这会将其从磁盘和该高速缓存中删除)。
附录:
另一种方法是将Map的文件复制到新文件中,删除旧文件,并将新文件重命名为旧文件。该高速缓存由文件支持。如果文件“消失”,缓存也会消失。
如果您可以识别这些文件,并且它们不被系统/其他正在运行的程序共享,那么编写脚本应该很简单,并且理想情况下,运行速度比复制6 GB的文件要快。
drkbr07n5#
您可以使用VM并在VM引导后立即拍摄快照。从快照恢复比重新引导快。