2017-05-07 52 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,提供的境界是如何工作的概述(看看境界節基礎的微),並且可能會感興趣的你。