虽然保存了相同的数据,但Realm Filesize会有所不同

时间:2016-07-14 14:09:52

标签: ios swift realm

我正在编写一个存储网站的iOS应用程序。每个站点都有不同的地址。对于测试,我创建了32k站点和32k地址。当我第一次创建所有这些数据点时,域文件占用了大约9GB的数据。为了确保存储这些数据所需的空间量,我多次重新运行测试。

每次运行这些测试时,文件大小都不同,范围从25mb到10gb。我不确定,问题似乎是什么。有什么建议我可以寻找吗?

2 个答案:

答案 0 :(得分:2)

如果文件大小远远大于您要存储的数据量,则可能会遇到称为version pinning的问题。

版本固定是指Realm实例在其他线程正在写入新数据时保持的时间比预期长得多。 Realm实例保留其正在查看的数据的版本,直到将其解除分配或刷新到最新版本。如果一个线程正在向Realm写入数据而另一个线程在旧版本中打开Realm实例,则新数据不能覆盖旧数据,因此文件大小最终会增长。当Realm实例被释放或升级到当前版本时,Realm文件中旧版本的空间被标记为空闲,可以重复用于后续写入。

导致版本固定的一种常见情况是在调度队列上使用Realm时,Realm实例最终会出现在调度队列的自动释放池中。调度队列相对不频繁地耗尽其自动释放池,这可能导致Realm实例的生命周期显着超出您的预期。为了避免这类问题,我们建议在调度队列中涉及Realm的所有工作都明确地包含在自动释放池中。这将确保及时发布Realm个实例。

答案 1 :(得分:1)

我比Realm-Swift更精通Realm-java,但是如果你保留一个属于非循环线程的Realm的旧实例,它们无法自我更新(在swift世界中,显然是那个背景线程和调度队列),你需要关闭Realm实例,并且在swift中,你需要将你的Realm包装在autoreleasepool中以便自动关闭它。以下是有关此行为的相关documentation

  

在取消分配Realm对象之前,不能重用Realm文件中的数据的中间版本。要避免此问题,在从调度队列访问Realm时应使用显式自动释放池。

我也认为如果减少在给定后台线程上执行的事务数量会有所帮助。

最终获得保留的旧版本占用了额外的空间,可以使用compactRealm进行压缩。为了实现这一点,需要在每个线程上关闭所有Realm实例。