目次

Storageの使い方
Firefox2 で導入されたDatabase API Storageに関する覚書

ここではMouseoverDictionaryを作ったときに,Storageを使って困ったところなんかを書いておきます.Storage以前にSQL自体使ったこと無いので,そのあたりからド素人ですが,何かの役に立つといいなぁ・・・・

Transactionについて

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");

みたいにするとうまくいきました.こちらなら数分で処理が終わります.

レコードの個数を数えるSQL

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版で試してみたら,なんか遅いままっぽいです・・・・まぁまだβ版だし,そのうち変わるかもと思って放置してます.

PRIMARY KEYを指定して高速化

辞書の 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. 

ページ 1 / 1

画像の非表示