【问题标题】:Memory Mapped FIle is slow内存映射文件很慢
【发布时间】: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_READWRITEGENERIC_EXECUTE 用于数据文件。
  • 一旦你使用了足够多的文件来填满你的可用 RAM,访问一个新块需要换出另一个块。当然会慢下来。
  • 您的典型访问模式是什么?您是按随机顺序还是按顺序访问文件?您是触摸所有文件还是仅触摸其中的一部分?您的视图是只读的,但是您可以通过读/写执行(!)打开其他所有内容。不要要求超出您需要的访问权限,因为这会产生限制,从而减慢速度。

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


【解决方案1】:

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

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

【讨论】:

  • 但是其他访问大文件的应用程序如何仍然保持大部分响应。是否通过线程,所以每个线程查看文件的不同部分?
  • @user2521432 磁盘针对串行访问(甚至 SSD)进行了优化,这是典型的访问模式,因此速度很快。每当您对文件进行密集的随机访问时,它都会很慢,无论您​​是直接读取它还是让操作系统通过内存映射来完成它。
猜你喜欢
  • 2016-02-23
  • 2019-01-18
  • 1970-01-01
  • 2010-11-01
  • 2011-05-14
  • 2016-12-08
  • 2010-09-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多