我在核心数据数据库中插入 cca 100 000 条记录。数据库包含 3 个实体。Player、Club、PlayerClub 实体之间存在关系: Player<-->>PlayerClub<<-->Club 在插入 PlayerClub 时,我注意到插入大约 50 000 条记录后大量内存消耗和速度损失。记录永远不会更新,因为 PlayerClub 只有唯一值。出于测试原因,我清空了 Player 和 Club 表并再次运行该程序。速度没有下降,但内存消耗再次巨大。这是代码:
NSManagedObjectContext *context = [[NSManagedObjectContext alloc] init];
[context setPersistentStoreCoordinator:ap.persistentStoreCoordinator];
[context setUndoManager:nil];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"PlayerClub"
inManagedObjectContext:context];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:entity];
NSEntityDescription *entityKlubovi = [NSEntityDescription entityForName:@"Club" inManagedObjectContext:context];
NSFetchRequest *requestKlubovi = [[NSFetchRequest alloc] init];
[requestKlubovi setEntity:entityKlubovi];
[requestKlubovi setFetchLimit:1];
NSEntityDescription *entityIgraci = [NSEntityDescription entityForName:@"Player" inManagedObjectContext:context];
NSFetchRequest *requestIgraci = [[NSFetchRequest alloc] init];
[requestIgraci setFetchLimit:1];
[requestIgraci setEntity:entityIgraci];
for (int i=0; i<[parsedKlubIgraci count]; i++) {
@autoreleasepool {
KlubIgrac *klubIgrac = [[KlubIgrac alloc] initWithEntity:entity insertIntoManagedObjectContext:context];
klubIgrac.iD = p.id;
//... add some othe properties
variables = [NSDictionary dictionaryWithObject:p.igracID forKey:@"ID"];
localPredicate = [predicateIgraci predicateWithSubstitutionVariables:variables];
[requestIgraci setPredicate:localPredicate];
klubIgrac.igrac = [self DohvatiIgracZaIgracId:p.igracID cntx:context request:requestIgraci predicate:localPredicate];
variables = [NSDictionary dictionaryWithObject:p.klubID forKey:@"ID"];
localPredicate = [predicateKlubovi predicateWithSubstitutionVariables:variables];
[requestKlubovi setPredicate:localPredicate];
klubIgrac.klub = [self DohvatiKlubZaKlubId:p.klubID cntx:context request:requestKlubovi predicate:localPredicate];
}
}
+(Club *)DohvatiKlubZaKlubId:(int)klubid cntx:(NSManagedObjectContext *)context
request:(NSFetchRequest *)request predicate:(NSPredicate *)predicate
{
@autoreleasepool {
NSError *error;
NSArray *arTmp;
arTmp = [context executeFetchRequest:request error:&error];
Club *klub;
if(arTmp != nil && [arTmp count]){
return [arTmp objectAtIndex:0];
}
}
}
DohvatiIgracZaIgracId 方法与 DohvatiKlubZaKlubId 方法基本相同,所以我不发布它。这段代码被调用了大约 100 000 次。之前的内存消耗约为 150 MB。在它完成它的 650 MB 之后。所以它消耗了 500 MB,没有保存上下文,也没有从数据库中获取任何内容,因为表是空的。如果我评论
arTmp = [context executeFetchRequest:request error:&error];
在 DohvatiIgracZaIgracId 和 DohvatiKlubZaKlubId 方法中,内存消耗降至 200 MB。因此,对于不执行任何操作的代码行,差异为 400MB。这不可能。任何人都有一些想法。一段时间后,我的应用程序消耗超过 2.5 GB。
mesuments 是在模拟器上完成的,因为我需要构建一个稍后会预加载的数据库,所以速度很重要 :)... 提前谢谢