内存中的领域文件用于生产应用程序

时间:2017-06-24 02:19:19

标签: ios swift realm realm-mobile-platform realm-object-server

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

例如,如果Instagram使用Realm,作为用户,我是否可以访问每个功能的多个领域(搜索,主要供稿,消息等)?在目前的限制下,Realm的第四个(当前)限制说明

任何单个Realm文件都不能大于允许应用程序在iOS中映射的内存量 - 这会更改每个设备,并取决于该时间点内存空间的碎片程度(有关于这个问题的雷达:(rdar:// 17119975))。如果您需要存储更多数据,可以将其映射到多个Realm文件。

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

数据库部分有意义,但如何将其映射到多个Realm文件甚至可以工作?

1 个答案:

答案 0 :(得分:0)

要了解此限制,需要了解操作系统的工作原理。

首先,您的iOS设备(或台式计算机或服务器......)将数据存储在RAM中。较旧的器件使用32位地址寻址此存储器;较新的器件使用64位地址寻址此存储器。

现在,计算机中的物理RAM全部都已解决。但是,您的应用程序永远不会看到或使用物理RAM的地址。这是因为现代操作系统使用virtual memory来提供一个间接层,允许每个进程“假装”它正在使用自己的内存空间。

虚拟内存使操作系统更容易实现一些有趣的功能。例如,mmap系统调用允许磁盘上的文件“映射”到进程的地址空间,允许进程以与读取和写入时相同的方式读取和写入该文件。内存。 Realm广泛使用这个功能,这也是Realm非常高效的部分原因。

实际上,所有设备(无论是电话,台式计算机还是服务器)的内存地址都比实际RAM多得多。这意味着,从理论上讲,您应该能够mmap一个大到千兆字节的文件,并且仍然有备用的地址。 (例如,在32位iOS设备上,操作系统应该能够为每个进程提供高达4 GB的可寻址空间。)

不幸的是,iOS强制限制进程的虚拟内存地址空间的大小,这意味着您可以打开的Realm文件的实际大小远远小于理论限制。究竟这些限制是如何工作的,对于Apple以外的任何人都不清楚,但在链接雷达中有一些观察结果(你可以阅读here)。

因此,该限制与“每用户领域”或后端无关。相反,这意味着iOS通常不会让您打开任何超过几百兆字节的Realm文件。

当我们说“映射到多个Realm文件”时,我们指的是手动“sharding”您的数据。例如,如果您正在创建电话簿应用程序,并且发现将所有条目放在单个Realm中导致mmap失败,您可能会将数据拆分为3个Realms:一个用于姓氏的人以A到H开头,一个是以I到S开头的姓氏,一个是以T到Z开头的姓氏。