【问题标题】:How big can a memory-mapped file be?内存映射文件可以有多大?
【发布时间】:2009-04-07 16:01:27
【问题描述】:

什么限制了内存映射文件的大小?我知道它不能大于未分配地址空间的最大连续块,并且应该有足够的可用磁盘空间。但是还有其他限制吗?

【问题讨论】:

    标签: mmap memory-mapped-files


    【解决方案1】:

    您太保守了:内存映射文件可能比地址空间大。内存映射文件的视图受到操作系统内存限制的限制,但这只是您一次查看的文件的一部分。 (我想从技术上讲,您可以一次映射文件不连续部分的多个视图,因此除了开销和页面长度限制之外,只有您正在查看的总字节数构成了限制。您可以查看字节[0 到 1024] 和字节 [240 到 240 + 1024] 具有两个单独的视图。)

    在 MS Windows 中,查看 MapViewOfFile 函数。它实际上需要 64 位文件偏移和 32 位长度。

    【讨论】:

    • 是的,我应该说“视图”。我需要一次访问整个文件,而不需要重新 mmapp()。
    • MapViewOfFile 在 64 位机器上采用 64 位长度
    • 一个无论如何都可以通过零的大小,这意味着“与文件一样大”
    【解决方案2】:

    这是我在Win32下使用内存映射文件时的经验:

    如果您将整个文件映射到一个片段中,它通常会在大约 750 MB 处取出,因为它无法找到更大的连续内存块。如果你把它分成更小的部分,比如每个 100MB,你可以获得大约 1500MB-1800MB,具体取决于正在运行的其他部分。

    如果您使用/3g switch,您可以获得超过 2GB 的内存,最高可达约 2700MB,但操作系统性能会受到影响。

    我不确定 64 位,我从未尝试过,但我认为最大文件大小仅受您拥有的物理内存量的限制。

    【讨论】:

    • 在 64 位上,限制是可用的地址空间,与 32 位上相同。您可以在只有 32MB 物理内存的 32 位计算机上映射 1 GB 视图。与您可以在只有 0.5GB 内存的 32 位机器上映射 10TB 视图的方式相同。只有您真正访问的 4kb 页面才会映射到实际内存中。
    • @springy76:您无法在 32 位机器上映射 10TB 视图。仅限 64 位。
    • @SergeyK。你说得对,这也是我想写的——但我的手指输入了别的东西。它应该是“在只有 0.5GB 内存的 64 位机器上映射 10TB 视图的方式相同”
    【解决方案3】:

    在 Windows 下:“文件视图的大小被限制为最大的可用连续未保留虚拟内存块。这最多为 2 GB 减去进程已保留的虚拟内存。”

    来自MDSN。

    我不确定 LINUX/OSX/Whatever Else,但它可能也与地址空间有关。

    【讨论】:

    • 澄清一下,这是文件视图的大小,而不是文件本身的大小。
    • “2 GB 减去进程已保留的虚拟内存”在 32 位机器上?在 64 位盒子上会有所不同吗?
    【解决方案4】:

    在 64 位 Windows 系统上,虚拟地址空间的限制为 >16 TB。这里讨论的问题很可能与混合 DWORD 和 SIZE_T 有关。

    【讨论】:

    • 你好马克,这里的信息和讨论是混淆发布错误信息。假设有 4 GB 的限制是误导读者。 Windows 系统上 mmaped 文件的最大限制为 16 TB。
    • 马克您好,感谢您的确认。请让我补充一下,给定的数字只是理论上的限制。通常,真正可用的虚拟地址空间受磁盘 i/o 速度与硬页错误频率的限制。这个因素定义了最大可用页面文件大小。
    • 在 32 位 Windows 上限制为 16TB,在 64 位 Windows 上限制为 256TB。虚拟内存在物理上也受到可用磁盘空间的限制。这取自stackoverflow.com/questions/6608820/…
    • 有关在 Windows 系统中分配和管理大量内存,另请参阅 codeproject.com/Articles/5267559/…
    • 有关Windows虚拟地址空间的更多信息,请咨询techcommunity.microsoft.com/t5/windows-blog-archive/…
    【解决方案5】:

    不应有其他限制。这些还不够吗? ;-)

    【讨论】:

      【解决方案6】:

      是的,内存映射文件是有限制的。最令人震惊的是:

      在 32 位系统上,内存映射文件不能大于 2GB。

      当 memmap 导致文件被创建或扩展超出文件系统中的当前大小时,新部分的内容是未指定的。在具有 POSIX 文件系统语义的系统上,扩展部分将用零字节填充。

      即使在我的 64 位、32GB RAM 系统上,如果我尝试读取一个大的 numpy 内存映射文件而不是使用字节偏移量获取其中的一部分,我也会收到以下错误:

      Overflow Error: memory mapped size must be positive

      使用大数据集真的很痛苦。

      【讨论】:

      • 您使用的是 32 位可执行文件吗?
      猜你喜欢
      • 1970-01-01
      • 2018-04-03
      • 1970-01-01
      • 1970-01-01
      • 2016-02-23
      • 1970-01-01
      • 2012-03-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多