内存映射文件很慢

时间:2015-07-14 15:24:23

标签: c++ windows visual-studio-2013 windows-7 memory-mapped-files

我正在尝试从内存映射文件中读取,但访问该文件需要很长时间。我将整个文件映射到我的程序,并且初始访问速度很快,但随后它开始大幅减速

文件大约47gb,我有16GB的RAM。我使用Visual Studios作为我的IDE在Windows 7上运行64位应用程序。以下是我的代码片段

    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);
    }

这只是因为文件太大以至于不断交换文件块需要很长时间,还是需要更快访问的其他参数?

编辑:我尝试使用只读而不是使用如上所示的读,写,执行,但速度仍然很慢。我理解内存映射和交换机交换空间的概念,但我认为我可能在做其他错误的事情阻碍了速度

1 个答案:

答案 0 :(得分:2)

这是因为分页。发生的事情是你的RAM只能容纳16GB的文件(实际上它因你的计算机上运行的其他程序而少,但为了简单起见,我们只是使用它)。

因此,如果您访问程序中不在RAM中的文件的一部分(比如说,文件的一部分在20GB段中),您的RAM需要与磁盘通信并传输一个全新的文件段到RAM。这需要很多时间。