私のiPhoneアプリケーションには、word
,length
およびlanguage
という属性を持つエンティティWords
があります。両方がインデックス化されています シンプルなコアデータの取り込みが非常に遅い
が、私はそれは、さまざまな言語には約400kの言葉があらかじめ入力しまった別のインポートアプリケーションにcdatamodelし、データベースをコピーしました。 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;
は、データベース内のエントリ数ですコアデータの問題?
EDIT: gcbrueckmannとjrturtonが指摘したように、それはfetchBatchSize
を設定するには良い点です。しかし、時間はまだ不満足であるフェッチ:述語が設定されて
2秒:
NSPredicate *述語= [NSPredicate predicateWithFormat: "長さ==%dと言語BEGINSWITHの%の@" @、ワード長、LNG ]; [fetchRequest setPredicate:predicate];
:バッチサイズが設定された
7秒[fetchRequest setFetchBatchSize:1]。
1述語とバッチサイズは
を設定し、両方のはまだ別のボトルネックがありますかとの二
は時々述語チェックの順序が同様に物事をスピードアップすることができ、おそらくより限定的な長さよりも言語です。たとえば、この場合、単語の60%が長さ基準を満たしていて、40%だけが言語基準を満たしていれば、最初に言語チェックを行う方が良いでしょう。もう1つのことは、これを高速化する必要がある場合は、プリロードしておき、メモリー内の配列をフィルタリングして、iphoneアプリで処理できるかどうかわからない場合です。 –
この場合、最初のクエリは整数を比較しています(インデックス作成は非常に速くなります)。2番目のクエリは文字列比較です(インデックス化された文字列でさえ高速にならない) - クエリを並べ替えることで助けになりました。しかし、それを試してみてください - 私はそれが助けられたかどうか見て興味があるだろう! – deanWombourne
ああ、私はそれを言い忘れた:私はすでに述語の順序を交換しようとしたが、それはフェッチをスピードアップしません。 – Norbert