2011-10-30 12 views
1

こんにちは皆さん、お手伝いができると願っています。私は、iPhoneアプリケーションのアナグラムチェッカーを作成しようとしています。私がしたいのは、最大81文字の長い文字列を取り、これを単語リストに対してチェックして、任意の長さのすべての可能な置換を見つけることができるようにすることです。iPhone - SQLiteデータベースのルーピングが長すぎる

私はシミュレータでこれを行う方法を理解しましたが、iPhoneでこれを実行すると、DB全体(約110000行)をループするのに約90秒かかります。私はInstrumentsをチェックしましたが、メモリリークは表示されません。しかし、私はオブジェクトの割り当てを使用するときは、クエリを実行すると、他のすべてを排水CFStringのための大規模な割り当てを作成することは明らかです。これは、すぐに全体のバイト列の下で3.09 MBを実行します。 (以下のコードでは、問題の原因を特定したいので、アナグラムチェックコードをすべて取り除いたので、現在のところ、これはすべて出力せずにDBをループしている)。

//create query 
    NSString *querySQL2 = @"SELECT name FROM table "; 

    sqlite3_stmt *statement2; 
    const char *query_stmt2 = [querySQL2 UTF8String]; 



    sqlite3_prepare_v2(contactDB, query_stmt2, -1, &statement2, NULL); 


    //loop through all rows of database 
    while (sqlite3_step(statement2) == SQLITE_ROW) 
    { 
     NSString *laststring = [[NSString alloc] initWithUTF8String: 
          (const char *) sqlite3_column_text(statement2, 0)]; 



     [laststring release]; 
     } 


    sqlite3_finalize(statement2); 
    sqlite3_close(contactDB); 

    } 

以下の「laststring」の作成がすべてのメモリを吸い取っているものであるように私には明らかと思われます。だから私は[最後のリリース]を置くとき、それはなぜですか? whileループの最後には効果がないようですね?私はこのコードをリリースしてもリリースしなくても実行しており、同じ量のメモリが使い果たされています。私はまた、それの周りにオートリリースをラップしようとしましたが、これも効果がありませんでした。

私はSQLiteを使ってループする他のいくつかのクエリを読みました。彼らの中にはインデックス作成を提案している人もいますが、この問題でかなりの時間を節約できるとは思えません。また、私が81文字の大きな文字列からすべての可能な置換を検索しているなら、単語リストの少なくとも50%はとにかくチェックする必要があると推測しています。

CFStringを保持する方法についてのご意見はありますか? 多くのお礼ありがとうございます Dave

+0

このコメントはあなたの質問に答えませんが、おそらくcoredataを見てください。パフォーマンスは、sqlite dbを直接使用するよりはるかに優れています。バッチサイズを設定したfetchedresultsコントローラを使用する場合。 – rdesign

+1

laststringのサイズが最大81文字であることがわかっている場合は、これに1つの静的文字列を使用するのはなぜですか? alloc/init/releaseは必要ありません。これまでのご意見ありがとうございます。 –

+0

これまであなたのアドバイスに感謝します。 – user1021019

答えて

-1

なぜNSStringをwhileループ内に配置しますか?

while(sqlite3_step(compiledStatement) == SQLITE_ROW) 
     { 
     NSString *laststring = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement2, 0)];  
     // do something with laststring 
     } 

でもかまいませんか?

+1

いいえあなたのソリューションは文字列をautoreleaseプールに追加し、関数全体が完了するまでのメモリは、多くの文字列で問題になる可能性があります。メモリを割り当てて解放すれば、メモリは直接解放されます。 – Bastian

関連する問題