2017-05-07 51 views
0

我一直在使用Realm-Swift中的分层数据集进行实验,特别是无限嵌套的节点(树)。说实话,我不确定如何衡量加载节点时数据集的性能,效率或影响。加载嵌套数据的效率

考虑一个数据结构是这样的:

Item (Root): 
    - Children[]: 
     + Item 
     - Item 
      - Children[]: 
       + Item 
       + Item 
      - CreatedOn 
     + Item 
     + Item 
     + Item 
     - Item 
      - Children[]: 
       + Item 
       + Item 
       + Item 
       + Item 
      - CreatedOn 
     + Item 
     + Item 
     + Item 
    - CreatedOn 

假设有大约1万个节点,这些都是一些问题,我有:

  1. 我明白境界支持属性的延迟加载。那么如果我单独查询根节点,那么所有100万个条目将不会被正确加载?
  2. 假设根节点本身具有100k个子节点,如果我要访问根节点的子节点item.Children域是否加载子节点列表中的所有节点?或者是否可以通过它们进行翻页?
  3. 当然,我们不希望内存中的所有100万条目都支持弱引用?如何管理这样的场景?

感谢任何帮助!

回答

1
  1. 你是对的,条目不会全部加载。 Realm对象之间的关系表示为底层数据结构中的指针,这意味着您应该能够创建任意复杂的对象树,而不会遇到加载任何单个对象的任何问题。

  2. Realm集合类型不会急于将它们表示的对象加载到内存中。对象本身是访问器周围的轻量级包装器,直接插入到底层数据结构中,而底层数据结构本身就是进程的地址空间中的磁盘(或内存中)文件mmap的一部分。请注意,内存管理有一些细微之处:由于Realm是一个MVCC数据库,并且由于数据库的给定快照的生命周期与引用该快照的对象的生命周期相关联,因此不小心编写的代码可能会不必要地强制Realm保留多个快照的数据库同时在内存中,导致内存使用量和文件大小增加。

  3. Realm Swift没有任何弱引用的概念,但由于上面的两点,它不应该需要它们。

我们的文章,Realm Threading Deep Dive,提供的境界是如何工作的概述(看看境界节基础的微),并且可能会感兴趣的你。