0

因此,对于访问应用程序中所有信息的用户,多个领域如何在单个应用程序中工作,我有点困惑。

例如,如果 Instagram 使用 Realm,作为用户,我是否会为每个功能(搜索、主提要、消息等)访问多个 Realm?在当前限制下,Realm 的第四个声明(当前)限制说

任何单个 Realm 文件都不能大于您的应用程序允许在 iOS 中映射的内存量——这会因设备而异,并且取决于当时内存空间的碎片化程度(对此问题有待观察) : (rdar://17119975))。如果需要存储更多数据,可以将其映射到多个 Realm 文件。

我认为这意味着设备上的空间有限,因此我需要每个用户一个可以访问任何和所有数据的领域,或者我仍然需要一个后端来存储数据。这个对吗?

数据库部分是有道理的,但是如何将它映射到多个 Realm 文件上呢?

4

1 回答 1

0

要理解这个限制,需要一些关于操作系统如何工作的知识。

首先,您的 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 开头的姓氏。

于 2017-06-26T16:49:20.213 回答