要理解这个限制,需要一些关于操作系统如何工作的知识。
首先,您的 iOS 设备(或台式电脑,或服务器……)将数据存储在 RAM 中。较旧的设备使用 32 位地址寻址此内存;较新的设备使用 64 位地址寻址此内存。
现在,您计算机中的物理 RAM 已全部寻址。但是,您的应用程序永远不会看到或使用物理 RAM 的地址。这是因为现代操作系统使用虚拟内存来提供间接层,允许每个进程“假装”它正在使用自己的内存空间。
虚拟内存使操作系统更容易实现一些有趣的功能。例如,mmap
系统调用允许将磁盘上的文件“映射”到进程的地址空间,从而允许进程以与从 RAM 读取和写入相同的方式读取和写入该文件。Realm 广泛使用此功能,这也是 Realm 性能出色的部分原因。
在实践中,所有设备(无论是手机、台式电脑还是服务器)的内存地址都比它们实际的 RAM 多得多。这意味着,理论上,您应该能够处理mmap
数 GB 大的文件,并且仍然有可用的地址。(例如,在 32 位 iOS 设备上,操作系统应该能够为每个进程提供高达 4 GB 的可寻址空间。)
不幸的是,iOS 对进程的虚拟内存地址空间的大小进行了限制,这意味着您可以打开的 Realm 文件的实际大小明显小于理论限制。Apple 以外的任何人都不清楚这些限制是如何工作的,但在链接的 Radar 中有一些观察结果(您可以在此处阅读)。
因此,限制与“每个用户的领域”或后端无关。相反,这意味着 iOS 通常不会让您打开任何大小超过数百兆字节的单个 Realm 文件。
当我们说“映射多个 Realm 文件”时,我们的意思是手动“分片”您的数据。例如,如果您正在创建一个电话簿应用程序,并且发现将所有条目放在一个领域中会导致mmap
失败,那么您可能会将数据拆分为 3 个领域:一个用于姓氏以 A 到 H 开头的人,一个用于以 I 到 S 开头的姓氏,一个用于从 T 到 Z 开头的姓氏。