gpt4 book ai didi

ios - 核心数据关系的性能改进

转载 作者:行者123 更新时间:2023-11-29 10:21:29 28 4
gpt4 key购买 nike

我有两个核心数据实体(它们之间存在关系及其逆关系),它们已预先填充(每个实体大约有 5 万个寄存器),我需要建立关系。这几乎是 1:1 的关系。它们具有共同的属性,因此如果两个属性相等,则它们必须处于关系中。

我试图以一种粗略的方式进行操作,并遇到了很多内存问题(它很快升级为内存警告)。

@autoreleasepool {        
NSFetchRequest *e2sRequest = [[NSFetchRequest alloc] initWithEntityName:@"Entity2"];
e2sRequest.includesPropertyValues = NO;
e2sRequest.includesSubentities = NO;
NSArray *e2s = [self.fatherMOC executeFetchRequest:e2sRequest error:nil];

if(e2s.count > 0) {
NSFetchRequest *e1sRequest = [[NSFetchRequest alloc] initWithEntityName:@"Entity1"];
e1sRequest.includesPropertyValues = NO;
e1sRequest.includesSubentities = NO;
NSArray *e1s = [self.fatherMOC executeFetchRequest:e1sRequest error:nil];

for(Entity1 *e1 in e1s) {
NSString *attributeInCommon = e1.attributeInCommon;
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"attributeInCommon = %@", attributeInCommon];
Entity2 *e2matching = (Entity2 *)[e2s filteredArrayUsingPredicate:predicate].lastObject;
if(e2) {
e1.e2 = e2matching;
}
}
}
}

我尝试在 NSDictionary 中获取公共(public)属性和内存中的 objectID,但没有结果。我已经尝试了更多的方法,一些非常慢,而另一些则是可怕的内存吞噬者。

我知道我必须检查错误,我知道我可以用更少的代码行来完成,但将其视为调试/紧急代码,所以我会被修复。

提前致谢

最佳答案

您正在尝试同时加载 100000 个项目,所以难怪您会遇到内存问题。

你需要批处理,如果你创建了一个自动释放池,你有时需要将它排空(所以它需要参与批处理)。

因此,在第一个提取请求上设置一个 fetchBatchSize。然后,遍历它找到的结果,一次获取 fetchBatchSize 项。这是池应该在的地方,所以它在每批之后被释放。从一批 100 件开始,看看效果如何。

然后每个批处理使用谓词进行第二个查询,以限制与当前批处理实际匹配的值集。

然后运行你的匹配逻辑。

还可以考虑使用 Instruments 中的核心数据工具来检查发生了什么,您向数据存储发出了多少请求以及这一切需要多长时间。

关于ios - 核心数据关系的性能改进,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34945570/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com