簡體   English   中英

保存具有很多冗余信息的對象(帶有核心數據)

[英]Save objects with many redundant information (with core data)

我正在Objective-C中設計一個使用核心數據結構的應用程序。

我有以下結構:

@interface classA : NSManagedObject
@property(nonatomic, strong) someType1 * property1;
..
@property(nonatomic, strong) someTypeN * propertyN;
@property(nonatomic, strong) NSSet * children;
@end

@interface classB : classA
@property (nonatomic, strong) classA * parent;
@end

我具有以下功能:

1)classA的每個對象在classB中將有許多子代。 (classB中的對象本身沒有孩子)。

2)此外,classB的大多數對象將與它們的父對象共享許多相同的屬性(例如,您可以認為在大多數情況下,classB的對象與其父類在classA中的相同屬性之間只有property1會有所不同,因此對於classB中的x x.property2 = x.parent.property2,依此類推)。

3)我將僅通過對classA類型的對象的請求來查詢數據庫。

我正在尋找一種方法,通過只存儲classB類型的對象的必要屬性來減少應用程序的磁盤內存使用量。 例如,我可以將classB對象的屬性設置為nil,除非它不同於其父對象的屬性,將classB的getter定義為:

- (sometypeX*) getPropertyX {
    if (propertyX) return propertyX;
    return parent.propertyX;
}

我的問題是:1)我真的要通過用nil值而不是實際值填充數據庫來獲取磁盤內存嗎?2)這樣的構造是否有缺點3)是否有更好的方法/設計模式來處理此問題?

在此先感謝您的幫助。

核心數據已高度優化。 它已經完成了您嘗試使用faulting實現的功能。 從文檔中的故障和獨特性

因為未實現故障,所以管理對象故障消耗的內存更少,並且與故障相關的管理對象根本不需要在內存中表示。

要回答您的問題...

1)我真的要通過用nil值而不是實際值填充數據庫來獲得內存嗎

如果您通過這種方法獲得了任何記憶,則可能微不足道。

2)這種結構是否有缺點

它沒有太多理由就增加了代碼庫的復雜性。 它使您的代碼難以閱讀,理解和維護。

3)是否有更好的方法/設計模式來解決此問題

只需以易於理解的方式使用Core Data,然后讓它處理優化,除非您有明確,可衡量的進一步優化需求。

我根據提出的問題進行了一些測試。

我測試了以下設置:我有一個具有11個NSString屬性的classA和classB中的子級。 classB是classA的子類,具有相同的屬性和父屬性。

我隨機創建了100至1000個classA實例,每個實例在classB中具有10至1000個孩子。 對於classA的對象,我將每個字符串屬性設置為隨機的10個字符的字符串。

我測試了兩個過程:-將objectA的子項的字段設置為nil-或將其設置為其父屬性。

我監視了數據庫文件的大小。

不幸的是,我無法從文件的增長速度中提取線性定律(雖然這僅適用於一個類,但對於這種更為復雜的父/子結構我無法弄清楚)。 此外,我不太理解以.sqlite結尾的文件與以.sqlite-wal結尾的文件之間大小的重新分配。

但是,在所有測試的方案中(總db大小在1 Mb和100 Mb之間),我發現與第二種方法相比,使用第一種方法時,我獲得了大約3倍的收益。

因此,對於這種使用方式,未設置某些屬性似乎導致數據庫大小的增加可忽略不計。

請告訴我是否要我詳細說明這個答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM