2009-04-07 187 views
23

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

+0

平台? Windows还是Linux? – 2009-04-07 16:08:18

回答

24

你太保守了:内存映射文件可能大于地址空间。内存映射文件的视图受操作系统内存限制的限制,但这只是您一次查看的文件的一部分。 (我想技术上你可以同时映射文件的不连续部分的多个视图,所以除了开销和页面长度限制之外,它只是你查看的总字节数,这会造成限制。 [0〜1024]和字节[2 至2 + 1024]具有两个单独的视图。)

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

+0

是的,我应该说“观点”。我需要一次访问整个文件,而不需要重新创建mmapp()。 – user88185 2009-04-07 16:38:31

+0

MapViewOfFile在64位机器上需要64位长度 – springy76 2015-07-22 10:32:11

1

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

+0

在64位操作系统上,这些限制似乎相当宽松...... – user88185 2009-04-07 16:36:11

1

在Windows环境下:“文件视图的大小被限制在未保留的虚拟存储器中的最大可用的连续块这是至多2 GB减去虚拟存储器已经由处理保留。”

MDSN

我不确定关于LINUX/OSX /无论其他,但它也可能与地址空间有关。

+1

只是为了阐明,这是文件视图的大小,而不是文件本身的大小。 – 2009-04-07 16:14:09

+5

“2 GB减去已被进程保留的虚拟内存”在32位机器上?它在64位盒子上有什么不同? – user88185 2009-04-07 16:35:15

0

在linux上使用FUSE你也可以创建一个内存扩展到磁盘的文件系统。我不确定这是否符合内存映射的规定,并且区分会变得模糊。

9

这已经使用Win32下内存映射文件时,根据我的经验:

如果你的地图将整个文件成一个网段,一般在各地的水龙头出来750 MB,因为它无法找到更大的连续内存块。如果你把它分成更小的部分,比如说每个100MB,你可以获得大约1500MB-1800MB,这取决于还有哪些运行。

如果您使用/3g switch,您可以获得2GB以上至2700MB左右的性能,但操作系统性能会受到影响。

我不确定64位,我从来没有尝试过,但我认为最大文件大小,然后限制只有物理内存的数量。