私は辞書を含む大規模なplistファイルを検索しています。数十万件あり、それぞれに2つのキー/文字列のペアがあります。私の検索アルゴリズムは辞書を通過し、辞書内のいずれかの文字列に一致するテキストが見つかると、辞書の内容が挿入されます。ここではそれがどのように動作するかです:Cocoa/Objective-Cの検索を最適化する
NSDictionary *eachEntry;
NSArray *rawGlossaryArray = [[NSArray alloc] initWithContentsOfFile:thePath]; // this contains the contents of the plist
for (eachEntry in rawGlossaryArray)
{
GlossaryEntry *anEntry = [[GlossaryEntry alloc] initWithDictionary:eachEntry];
NSRange titleResultsRange = [anEntry.title rangeOfString:filterString options:NSCaseInsensitiveSearch];
NSRange defResultsRange = [anEntry.definition rangeOfString:filterString options:NSCaseInsensitiveSearch];
if (titleResultsRange.length > 0 || defResultsRange.length > 0) {
// store that item in the glossary dictionary with the name as the key
[glossaryDictionary setObject:anEntry forKey:anEntry.title];
}
[anEntry release];
}
検索が実行されるたびに、私のiPhoneアプリで約3-4秒の遅延がある(少なくとも、デバイス上の、すべてのものは、シミュレータでかなり迅速に実行されます)。どのように私はこの検索を最適化するかもしれないかアドバイスできますか?
返信いただきありがとうございます。私は両方の提案を試みましたが、どちらのカウントでも目立った改善はありませんでした。 plistファイルが一度読み込まれたことを明確にするだけです(ループの各繰り返しではなく、新しい検索文字が入力された後など)。しかし、シングルトンのインスタンスを作成することはどちらの方法でも役に立ちませんでしたが、ここではボトルネックには見えません。 もう一度ありがとうございます。 – moigno
あなたが私が毎回ファイルを読み込むことについて私が誤解していたかどうか、あなたのコメントから分かりません。私はループでそれを読み込むことを意味しませんでした、私は彼らが検索を行うときにそれを読み込むことを意味しました。ファイルを一度読み込むと(アプリケーションの起動時など)、検索機能はメモリからあらかじめロードされたデータを使用します。 –
あなたは大丈夫です、私は現在、検索クラスの初期化でファイルの共有インスタンスをロードしています...少々のパフォーマンスの向上があるようですが、残念ながらそれはまだかなり遅いです。とにかくありがとう。 – moigno