【发布时间】:2015-10-03 08:08:12
【问题描述】:
我正在尝试从内存映射文件中读取,但访问该文件需要很长时间。我正在将整个文件映射到我的程序,并且初始访问速度很快,但随后它开始急剧变慢
文件约为 47gb,我有 16gb 的 RAM。我正在使用 Visual Studios 作为我的 IDE 在 Windows 7 上运行 64 位应用程序。下面是我的代码的 sn-p
hFile = CreateFile( "Valid Path to file", // name of the write
GENERIC_READ , // open for reading
0, // do not share
NULL, // default security
OPEN_EXISTING, // existing file only
FILE_ATTRIBUTE_NORMAL, // normal file
NULL); // no attr. template
if (hFile == INVALID_HANDLE_VALUE)
{
cout << "Unable to open vals" << endl;
exit(1);
}
hMapFile = CreateFileMapping(
hFile,
NULL, // default security
PAGE_READONLY, // read/write access
0, // maximum object size (high-order DWORD)
0, // maximum object size (low-order DWORD)
NULL); // name of mapping object
if (hMapFile == NULL)
{
cout<< "Error code " << GetLastError() << endl;
exit(1);
}
data = (float*) MapViewOfFile(
hMapFile,
FILE_MAP_READ,
0,
0,
0);
if (data == NULL)
{
cout << "Error code " << GetLastError() << endl;
CloseHandle(hFile);
exit(1);
}
这仅仅是因为文件太大以至于不断交换文件块需要很长时间,还是我需要一些其他参数来加快访问速度?
编辑:我尝试使用只读而不是使用读、写、执行,如上所示,但速度仍然很慢。我了解内存映射和切换交换空间的概念,但我认为我可能一直在做其他错误,阻碍了速度
【问题讨论】:
-
我绝对不会将
PAGE_EXECUTE_READWRITE或GENERIC_EXECUTE用于数据文件。 -
一旦你使用了足够多的文件来填满你的可用 RAM,访问一个新块需要换出另一个块。当然会慢下来。
-
您的典型访问模式是什么?您是按随机顺序还是按顺序访问文件?您是触摸所有文件还是仅触摸其中的一部分?您的视图是只读的,但是您可以通过读/写执行(!)打开其他所有内容。不要要求超出您需要的访问权限,因为这会产生限制,从而减慢速度。
标签: c++ windows visual-studio-2013 windows-7 memory-mapped-files