繁体   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