27

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

4

6 回答 6

27

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

在 MS Windows 中,查看MapViewOfFile函数。它有效地采用 64 位文件偏移量和 32 位长度。

于 2009-04-07T16:17:09.053 回答
9

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

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

如果您使用/3g 开关,您可以获得超过 2GB 到大约 2700MB,但操作系统性能会受到影响。

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

于 2009-10-27T10:09:46.897 回答
1

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

来自MDSN

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

于 2009-04-07T16:12:21.657 回答
1

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

于 2020-06-03T10:41:39.003 回答
0

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

于 2009-04-07T16:08:51.273 回答
0

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

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

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

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

Overflow Error: memory mapped size must be positive

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

于 2018-04-09T17:55:23.067 回答