使用许多冗余信息保存对象(使用核心数据)

时间:2015-04-01 15:21:34

标签: ios cocoa 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的父级中的属性相同,属性1不同,所以对于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)是否有更好的方法/设计模式来处理这个问题?

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

核心数据经过高度优化。它已经使用错误实现了您尝试实现的功能。来自文档中的Faulting and Uniquing

  

由于未实现故障,托管对象故障消耗的内存较少,并且根本不需要在内存中表示与故障相关的托管对象。

回答你的问题......

  

1)我真的会通过用nil值而不是实际值填充我的数据库来获得记忆

如果你通过这种方法获得任何记忆,那可能是微不足道的。

  

2)这种结构是否存在缺陷

它为您的代码库增加了很多复杂性而没有太多理由。它使您的代码更难以阅读,理解和维护。

  

3)是否有更好的方法/设计模式来处理这个问题

只需以易于理解的方式使用Core Data,并让它处理优化,除非您有明确的,可衡量的进一步优化需求。

答案 1 :(得分:0)

我在问过问题之后做了一些测试。

我测试了以下设置:我有一个带有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倍。

因此,对于这种使用方式而言,不设置某些属性似乎会导致db大小的增益微不足道。

如果您希望我详细说明这个答案,请告诉我。

相关问题