【问题标题】:Visual C++6 MFC MapViewOfFile returns error code 8Visual C++6 MFC MapViewOfFile 返回错误代码 8
【发布时间】:2013-03-12 12:08:35
【问题描述】:

我有一个正在创建地图文件的程序,它能够很好地调用 m_hMap = CreateFileMapping(m_hFile,0,dwProtect,0,m_dwMapSize,NULL);,但是当随后的函数调用 MapViewOfFile(m_hMap,dwViewAccess,0,0,0) 时,我得到一个错误代码 8,即 ERROR_NOT_ENOUGH_MEMORY,或错误字符串“错误没有足够的存储空间来处理此命令”。

所以我并不完全理解 MapViewOfFile 为我做了什么,以及如何解决这种情况。

一些数字...

m_dwMapSize = 453427200
dwProtect = PAGE_READWRITE;
dwViewAccess = FILE_MAP_ALL_ACCESS;

我认为我的页面大小是65536

【问题讨论】:

  • 您要映射的文件有多大?
  • 我假设您打算只映射文件的前 ~432MB,对吧?无论如何,您的进程是否有足够的虚拟内存来映射文件?默认情况下,32 位 Windows 上的限制为 2GB。
  • 嗯,所以它似乎正在创建和销毁内存视图,并根据需要增长,如果它试图最终将整个内容加载到内存中,我不会完全感到惊讶。

标签: c++ mfc visual-c++-6 pagefile file-mapping


【解决方案1】:

如果您使用的是 64 位处理器,那么系统将分配总共 4GB 内存,位设置为 LargeaddressAware。 转到配置属性->链接器->系统。在启用 largeaddressware:检查 是的 /LARGEADDRESSAWARE 并检查。

【讨论】:

    【解决方案2】:

    如果文件非常大,要读取,建议分小块读取,然后逐块处理。而 MapViewOfFile 函数用于在内存中映射一块。

    查看http://msdn.microsoft.com/en-us/library/windows/desktop/aa366761(v=vs.85).aspx 需要偏移量才能正确完成其工作,即如果您想分段读取非常大的文件。主要是由于碎片和相关原因非常大的内存请求失败。

    【讨论】:

    • 什么是 m_hMap = CreateFileMapping(m_hFile,0,dwProtect,0,m_dwMapSize,NULL);正在做?不是分配内存吗?
    • 您可以将 MapViewOfFile 想象为您正在打开的文件的 malloc+memcpy ,仅此而已(实际上是相反的:malloc 可以使用平板内存映射)。所以 MapViewOfFile 通常只选择一个地址,它可以在内存中连续容纳文件视图的字节。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-07
    • 1970-01-01
    • 2019-02-28
    相关资源
    最近更新 更多