[BlueLeaf1336]> PROBLEMS> EdictScanner>

英和/和英辞書 edict 専用ビューア EdictScanner > もうすこしマシに

historyTOP

2008/05/18:作成

2008/05/26TOP

一度見出し語リストを作ったら、edict 辞書を最新のものに置き換えるまで使えるわけだから、見出し語リストを作成するときに時間のかかる処理を押し込めることにしました。

見出し語リストの作成で「単語の取り出し(10秒程度)」、読み込みで「ソート(10秒程度)」を行っていたのを、見出し語リストの作成時に「単語の取り出しとソート(20秒程度)」までやってしまい、読み込みは読み込みのみ(250ミリ秒)で、体感速度アップです。

こういうのが楽しいわけで。

もちろんアレです。辞書と見出し語リストが別物だったら表示がおかしいですけど、別にねぇ。

あとクリップボードに何かがコピーされたら勝手に検索するようにしてみました。でも...あんまりな感じ。

20080527_EdictScanner_src.zip(223,588bytes)

2008/05/22TOP

見出し語を作成するのに10分以上かかって、あきらめるぎりぎりで原因がわかりました。

見出し語の一覧を THashedStringList に保持してるんですが、Create 直後に Sorted := True に設定していました。というのも Duplicates := dupIgnore を使って重複行を少しでもはじこうという思いで。

で、これが原因でした。見出し語として、基本的にはすべての単語を拾い上げる方向でやっているので、オリジナルの edict.gz が 144826 行(8,519,675バイト)なのに対して、edict.index (見出し語ファイル) は、606584 行(12,400,040バイト)になっています。

Sorted := True にしていると、THashedStringList に Add() するたびにソート処理が動くと思うので、60万回以上のソートが発生していると。そりゃ遅いわな。

Sorted := True をやめて、リストに見出し語を追加し終わった後で Sorted := True としてやると、20秒程度に縮まりました。ボトルネックってこういうことか、という見本のような劇的さ。で、見出し語の抽出自体も省略(1回やったらファイルに吐き出しといて次回は読み込む)してやると、10秒程度。ぎりぎり耐えられます。

とりあえずこんな感じです。

入力した検索語で TStringList.Find() を使って、見出し語リストを検索してその検索語を含む行の頭出しをします。なので前方一致限定です。おまけというか副作用というか、ヒットしないときは近いやつに頭出しします。近いっていっても強烈に遠いんですが、ソートした見出し語リストの中にその検索語を挿入したらどこに挿入されるかで頭出しします。辞書的にはこれっぽっちも意味なし。

それはそうと、クリップボードにコピーした内容を勝手に検索する方向で考えてますが、どうやって表示しようか悩んでます。

見たとおり、1行が長いです。はみ出してます。検索のために、見出し語ファイルの 60万行 をリストボックスに表示しているんですが、ListBox 自体にはデータを持たせたくありません。で、Sytle を lbVirtual にしてるのはいいんですが、そうすると行ごとに高さを変えるといったことができなくなります。あーどうしよう。

20080523_EdictScanner_src.zip(219,200bytes)

あと、辞書ファイルと見出し語ファイルの整合性のチェックなんてことは一切やってません。ずれたときにどうなるかも調べてません。よくないことがメガパー起きるだろうなぁと思います。こういう横着は、自分で使うために自分で作る時の特権というか。

2008/05/18TOP

見出し語だけメモリ内に抱える方向で攻めてみることにした。まだ試行錯誤中。

その前にメモ。

で。

レベルのあってない項目が入り乱れてますが、こんなんでやってみることにします。

2008/05/14TOP

久しぶりに、edict のサイトを見てみました。着々と語彙が増えているようです。以前に作ったやつは、まったくナットクできてなかったのでもう一度トライしてみることにしました。edict には 2バージョンほどあるようですが、今回も Ver.1 を使います。

以前と同じやり方、単純に検索語を全文検索して引っ掛けるやり方では面白くないし、使ってみると使い心地もかなり悪いので、別の方法を模索してみることにしました。

やっぱり辞書は見出し語があってそれに引っ掛けるべきかと。なので、パフォーマンスは棚に上げてやってみました。

みたいなことでやってみると、8320KB の辞書データを分割してメモリ内にデータを抱え込む準備だけで 30秒以上かかり、50MB以上メモリを使ってる。

だめだ。やっぱり辞書データそのものはファイルに任せないと。見出し語だけメモリに抱えるべきっぽい。

反省のために
20080514_EdictScanner_src.zip(201,827bytes)

後で確認するために転載。
edict.lzh(3,131,953bytes)

EOFTOP