2

私は単語ベースのゲームに取り組んでおり、解決アルゴリズムが機能するように、180,000語の辞書(1.9MB)を配列にロードする必要があります。辞書は、次のように1行に1語だけです。

a
ab
abs
absolutely
etc
...

現在、次のコードを使用してそのファイルを配列にロードしています。

NSString *txtPath = [[NSBundle mainBundle] pathForResource:@"dict" ofType:@"txt"];
        NSString *stringFromFile = [[NSString alloc]
                                    initWithContentsOfFile:txtPath
                                    encoding:NSUTF8StringEncoding
                                    error:&error ];       
for (NSString *word in [stringFromFile componentsSeparatedByString:@"\r\n"]) {
            [wordsArray addObject:word];
        } 

これには、iPhone 4では約3〜4秒かかります。古いiOSデバイスではおそらくさらに遅くなります。これを行うためのより速い方法はありますか?

4

2 に答える 2

2

これは、Grand Central Dispatch(GCD)を使用して、メインスレッドから離れたバックグラウンドで簡単に実行できます。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW、0)、^(void){
        NSString * txtPath = [[NSBundle mainBundle] pathForResource:@ "dict" ofType:@ "txt"];
        NSString * stringFromFile = [[NSString alloc]
                                    initWithContentsOfFile:txtPath
                                    エンコーディング:NSUTF8StringEncoding
                                    エラー:&エラー];       
        for(NSString * word in [stringFromFile componentsSeparatedByString:@ "\ r \ n"]){
            [wordsArray addObject:word];
        }
});

私はメモリから同封のディスパッチコードを書きましたが、それは近くにあり(正しくない場合)、あなたはその考えを理解していると思います。

編集:このコードはメインスレッドで実行できますが、メインスレッド以外のディスパッチキューはコードが実行される場所であるため、UIがブロックされることはありません。

forループを次のように置き換えることで、ここでコードのパフォーマンスを少し向上させることができます。

[wordsArray setArray:[stringFromFile componentsSeparatedByString:@"\r\n"]];

(配列)からの結果を繰り返して別の-componentsSeparatedByString:配列に入れる必要はありません。180Kの単語で、それはすぐそこにかなりの時間を節約するはずです。

于 2012-04-13T18:25:27.970 に答える
1

単語リストをSQLiteデータベースにプリロードしてから、SQLクエリを使用して、使用しているパターンを使用して検索する方がおそらく高速です。インデックスを利用して、さらに高速にすることができます。

于 2012-04-13T18:45:36.617 に答える