所以,对于访问应用程序中的所有信息的用户来说,多个 Realm 如何在单个应用程序中工作,我有点困惑。
例如,如果 Instagram 使用 Realm,那么作为用户,我是否访问了每个功能(搜索、主提要、消息等)的多个 Realm?在当前限制下,Realm 的第四个声明(当前)限制说
任何单个 Realm 文件都不能大于您的应用程序在 iOS 中允许映射的内存量 — 这因设备而异,并且取决于内存空间在那个时间点的碎片化程度(关于这个问题有一个开放的雷达:(rdar://17119975))。如果您需要存储更多数据,您可以将其映射到多个 Realm 文件。
我认为这意味着设备上的空间有限,因此我要么需要每个用户访问任何和所有数据的 Realm,要么我仍然需要一个后端来存储数据。这是对的吗?
数据库部分是有意义的,但是如何在多个 Realm 文件上映射它呢?
要了解此限制,需要了解操作系统的工作原理。
首先,您的iOS设备(或台式计算机或服务器...)将数据存储在RAM中。较旧的设备使用 32 位地址寻址此内存;较新的设备使用 64 位地址寻址此内存。
现在,计算机中的物理RAM已全部解决。但是,您的应用程序永远不会看到或使用物理 RAM 的地址。这是因为现代操作系统使用虚拟内存来提供间接层,允许每个进程"假装"它正在使用自己的内存空间。
虚拟内存使操作系统更容易实现一些有趣的功能。例如,mmap
系统调用允许将磁盘上的文件"映射"到进程的地址空间中,从而允许进程以与从 RAM 读取和写入相同的方式读取和写入该文件。Realm 广泛使用了这个特性,这也是 Realm 高性能的部分原因。
实际上,所有设备(无论是手机、台式计算机还是服务器)的内存地址都比实际 RAM 多得多。这意味着,从理论上讲,您应该能够mmap
一个几千兆字节大的文件,并且仍然有备用地址。(例如,在 32 位 iOS 设备上,操作系统应该能够为每个进程提供最多 4 GB 的可寻址空间。
遗憾的是,iOS 对进程的虚拟内存地址空间有多大施加了限制,这意味着你可以打开的 Realm 文件的实际大小明显小于理论限制。苹果以外的任何人都不清楚这些限制是如何工作的,但在链接的雷达中有一些观察结果(你可以在这里阅读)。
因此,限制与"每个用户的领域"或后端无关。相反,这意味着iOS通常不会让你打开任何大小超过几百兆字节的Realm文件。
当我们说"映射多个 Realm 文件"时,我们的意思是手动"分片"您的数据。例如,如果您正在创建一个电话簿应用程序,并且发现将所有条目放在一个 Realm 中会导致mmap
失败,那么您可以将数据拆分为 3 个领域:一个用于姓氏以 A 到 H 开头的人,一个用于姓氏以 I 到 S 开头的姓氏, 一个用于以 T 到 Z 开头的姓氏。