ここではMouseoverDictionaryを作ったときに,Storageを使って困ったところなんかを書いておきます.Storage以前にSQL自体使ったこと無いので,そのあたりからド素人ですが,何かの役に立つといいなぁ・・・・
StorageはSQLiteを使ってるらしいです.SQLiteそのものの問題っぽいですが,大量の繰り返し処理とかを行うとすごく遅いのが目立ちます.
例えば,英辞郎の辞書(140万件くらい?)を登録する際に
statement = mDBConn.createStatement("INSERT INTO dict VALUES (?1,?2)");
while(....)
{
:
statement.bindUTF8StringParameter(0, word);
statement.bindUTF8StringParameter(1, description);
statement.execute();
}
みたいにすると,1時間や2時間では終わりません.そこで Transaction を使ってデータベースを占有することで高速化を図るんですが,MDCのページのやり方を試しても,どうもうまくいきません.でも,単純に
statement = mDBConn.createStatement("INSERT INTO dict VALUES (?1,?2)");
mDBConn.executeSimpleSQL("BEGIN TRANSACTION");
while(....)
{
:
statement.bindUTF8StringParameter(0, word);
statement.bindUTF8StringParameter(1, description);
statement.execute();
}
mDBConn.executeSimpleSQL("END TRANSACTION");
みたいにするとうまくいきました.こちらなら数分で処理が終わります.
MouseoverDictionaryで辞書に登録した項目数を数えたいなぁと思ったんですが,これがなかなかうまく行きませんでした.その理由のひとつはSQLを全然知らないから,もうひとつはStorage(SQLite?)が遅すぎるからです.
var count_statement= mDBConn.createStatement("SELECT COUNT(*) FROM dict");
count_statement.executeStep();
num_of_record = count_statement.getInt32(0);
みたいな感じで,とりあえず TABLE dict のレコード数を数えることができますが,140万件数えようとするとすっっっっごく遅いです.でも transactionを確保してやると,とりあえず現実的な時間(数秒)で結果を得ることができます.
mDBConn.executeSimpleSQL("BEGIN TRANSACTION");
var count_statement= mDBConn.createStatement("SELECT COUNT(*) FROM dict");
count_statement.executeStep();
num_of_record = count_statement.getInt32(0);
mDBConn.executeSimpleSQL("END TRANSACTION");
こんな感じです.SQLがひとつだけの時でもtransactionを確保したほうが早いみたいですね.
でもLinux版で試してみたら,なんか遅いままっぽいです・・・・まぁまだβ版だし,そのうち変わるかもと思って放置してます.
辞書の TABLE を構築する際に,
mDBConn.executeSimpleSQL("CREATE TABLE dict (key TEXT,desc TEXT)");
のように dict の構造を指定すると, key での検索が遅いです.140万件のレコードだと帰ってくるのに1~2秒くらいかかります.マウスオーバー辞書としてはこのレスポンスは致命的です.最後に INSERT したデータが一番反応が鈍いので,線形探索をしてるような感じです.そこで,
mDBConn.executeSimpleSQL("CREATE TABLE dict (key TEXT PRIMARY KEY,desc TEXT)");
のように PRIMARY KEY を指定すると,レスポンスは劇的に改善されます.
ただし,前方一致みたいな検索では改善が殆どみられませんでした.
ホーム / Firefox extension 作成のTips (C)2006 Ichiro Maruta. All rights reserved.