我的iPhone应用程序具有实体Words
,属性word
,length
和language
。两者都被编入索引: 简单核心数据提取非常缓慢
我将cdatamodel和数据库复制到一个单独的导入器应用程序,在该应用程序中预填了大约400k字的不同语言。我通过查看SQLite文件来验证导入,然后将预填充的数据库复制回iPhone项目。
首先我认为(简单)谓词是问题。但是,即使在读取请求删除谓语之后,它需要很长的时间来执行:
2011-09-01 09:26:38.945 MyApp[3474:3c07] Start
2011-09-01 09:26:58.120 MyApp[3474:3c07] End
这里是我的代码如下所示:
// Get word
NSLog(@"Start");
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Words" inManagedObjectContext:appDelegate.managedObjectContext];
[fetchRequest setEntity:entity];
NSError *error = nil;
NSArray *fetchedObjects = [appDelegate.managedObjectContext executeFetchRequest:fetchRequest error:&error];
if (fetchedObjects == nil) {
//... error handling code
}
[fetchRequest release];
NSLog(@"End");
return fetchedObjects;
是条目的数据库中的数核心数据的问题?
编辑: 作为gcbrueckmann和jrturton指出,这是一个好点的设置fetchBatchSize
。但取时间仍然是不令人满意的:
2秒谓词组:
NSPredicate *谓词= [NSPredicate predicateWithFormat:@ “长度==%d与语言BEGINSWITH%@”,字长,LNG ]。 [fetchRequest setPredicate:predicate];
7秒与批料尺寸集:
[fetchRequest setFetchBatchSize:1];
1与谓词和批量大小都第二套
是否还有另一个瓶颈?
在你的谓词是语言可能比长度更严格,谓词检查有时为了能够加快速度为好。例如在这种情况下,如果有60%的单词符合您的长度标准,但只有40%符合语言标准,最好先进行语言检查。另一件事可能是,如果你需要更快的速度将是它预先加载,然后过滤内存中的数组不知道如果你的iPhone应用程序可以处理,但。 –
在这种情况下,第一个查询是比较整数(索引将使这非常快),第二个是字符串比较(即使索引字符串不会很快) - 如果重新排序查询帮助,我会感到惊讶。但是,请尝试一下 - 我有兴趣看看它是否有帮助! – deanWombourne
哦,我忘了提及它:我已经试图交换谓词的顺序,它不会加快取回。 – Norbert