什么限制了内存映射文件的大小?我知道它不能超过最大的连续未分配地址空间块,并且应该有足够的可用磁盘空间。但还有其他限制吗?
答案 0 :(得分:24)
你太保守了:内存映射文件可能比地址空间大。内存映射文件的视图受操作系统内存限制的限制,但这只是您一次查看的文件的一部分。 (我想从技术上讲,你可以同时映射文件不连续部分的多个视图,所以除了开销和页面长度限制之外,它只是你所看到的总字节数构成一个限制。你可以查看字节[0到1024]和字节[2 40 到2 40 + 1024],有两个不同的视图。)
在MS Windows中,查看MapViewOfFile功能。它实际上需要64位文件偏移量和32位长度。
答案 1 :(得分:9)
这是我在Win32下使用内存映射文件时的经验:
如果将整个文件映射到一个段,它通常会以大约750 MB的速度点击,因为它找不到更大的连续内存块。如果你把它分成更小的部分,比如每个100MB,你可以得到大约1500MB-1800MB,具体取决于其他的运行。
如果你使用/3g switch,你可以获得超过2GB,最高可达2700MB,但操作系统性能会受到惩罚。
我不确定64位,我从未尝试过,但我认为最大文件大小仅限于你拥有的物理内存量。
答案 2 :(得分:1)
应该没有其他限制。那些不够吗? ; - )
答案 3 :(得分:1)
在Windows下:“文件视图的大小限制为最大可用的连续虚拟内存块。最多2 GB减去进程已保留的虚拟内存。”
来自MDSN。
我不确定LINUX / OSX / Whatever Else,但它可能也与地址空间有关。
答案 4 :(得分:0)
在Linux上使用FUSE,您还可以创建一个按需扩展到磁盘的内存文件系统。我不确定它是否符合内存映射的要求,并且区别变得模糊不清。
答案 5 :(得分:0)
是的,内存映射文件有限制。最令人震惊的是:
在32位系统上,内存映射文件不能大于2GB。
当memmap导致文件系统中创建或扩展文件超出其当前大小时,新部件的内容未指定。在具有POSIX文件系统语义的系统上,扩展部分将填充零字节。
即使在我的64位32GB RAM系统上,如果我尝试读取一个大的numpy内存映射文件而不是使用字节偏移量来获取部分内容,我会收到以下错误:
Overflow Error: memory mapped size must be positive
大数据集真的很难用。
答案 6 :(得分:0)
在64位Windows系统上,虚拟地址空间的限制为16 TB。这里讨论的问题很可能与将DWORD与SIZE_T混合在一起。
答案 7 :(得分:-4)
关于这个主题的维基百科条目: http://en.wikipedia.org/wiki/Memory-mapped_file