7

最初にコアデータストアに挿入した大量のデータを解析しています。

後で、同じXMLを解析していますが、一部は更新されている可能性があります。次に、同じタグを持つ既存のレコードをチェックし、すでに存在する場合は、データでレコードを更新します。

ただし、最初の解析(約11.000レコード)には8秒ほどかかりますが、更新にはコストがかかり、144秒かかります(これらはシミュレーターの実行であるため、実際のデバイスではかなり長くなります)。

1回目は問題ありませんが(プログレスバーを表示しています)、2回目は許容できないほど長いので、速度を向上させるために何かをしたいと思います(別のスレッドのバックグラウンドで発生しますが)。

残念ながら、XML内のデータは個々のレコードごとに変更されている可能性があるため、検索または作成の問題ではありません。したがって、それぞれが基本的に更新を必要とする可能性があります。

属性のインデックスを作成しました。これにより、最初の解析と更新も高速化されましたが、それでも低速です(上記の数値はインデックス付きです)。私が気付いたのは、解析/更新が徐々に遅くなっているように見えることです。最初は高速ですが、処理されるレコードが増えるにつれて、徐々に遅くなります。

最後に、私の質問は、データセットを更新する速度を改善する方法について何か提案がありますか?レコードのフェッチにMagicalRecordを使用しています。コードは次のとおりです。

Record *record;
if (!isUpdate) {
    record = [NSEntityDescription insertNewObjectForEntityForName:@"Record" inManagedObjectContext:backgroundContext];
} else {
    NSPredicate *recordPredicate = [NSPredicate predicateWithFormat:@"SELF.tag == %@", [[node attributeForName:@"tag"] stringValue]];
    record = [Record findFirstWithPredicate:recordPredicate];
}
4

4 に答える 4

3

大量のフェッチを実行する代わりに、エンティティタイプごとに1つのクエリを実行し、タグごとに辞書に保存してから、そのキーを持つオブジェクトがあるかどうか辞書を確認します。タグのみを含めるようにpropertiesToFetchを設定できるはずであり、オーバーヘッドが削減されるはずです。

于 2012-05-01T19:08:55.570 に答える
1

シニアの回答とプロパティのハッシュを組み合わせて試すこともできます。

プロパティを挿入ハッシュし、そのハッシュをの一種のチェックサムプロパティとして保存しますRecord
更新時に、フェッチされたプロパティをタグとチェックサムに設定し、すべてのアイテムを1回フェッチします。次に、データセットを反復処理するときに、チェックサムがフェッチされたものと異なる場合は、それをフェッチしRecordて更新できます。

于 2012-05-01T19:45:00.420 に答える
1

試すことができる1つのことは、テンプレートNSPredicateを使用して、実行しているすべての検索/フェッチのフォーマット文字列を再解析しないようにすることです。

したがって、ループに入る前に:

NSPredicate *template = [NSPredicate predicateWithFormat:@"SELF.tag == $RECORD_TAG"];

ループ内:

Record *record;
if (!isUpdate) {
    record = [NSEntityDescription insertNewObjectForEntityForName:@"Record" inManagedObjectContext:backgroundContext];
} else {
    NSPredicate *recordPredicate = [];
    record = [Record findFirstWithPredicate:[template predicateWithSubstitutionVariables:[NSDictionary dictionaryWithObject:[[node attributeForName:@"tag"] stringValue] forKey:@"RECORD_TAG"]];
}

詳細については、Appleの述語プログラミングガイドを参照してください。

于 2012-05-01T18:19:54.213 に答える
1

すべてのパフォーマンスの問題に対する最初の答えは、機器を実行することです。次に、そのデータを使用して、問題のある領域を特定できます。そこから、パフォーマンスの向上の特定の側面について、他の具体的な質問がある場合があります。

私たち人間は、パフォーマンスのボトルネックを特定するのが苦手なことで有名です。したがって、最初に楽器を使用してください。それは確かにあなたの時間がどこで費やされているかを教えてくれます。

于 2012-05-02T12:51:55.830 に答える