簡易データベースの仕様
Windowsで動作するインタプリタ型のプログラム言語「HSP(Hot Soup Processor)」で開発した仕事用の検索アプリと簡易データベースのお話。テキストファイルから簡易データベースを作成する部分のソースを流用して別なアプリを開発していた時に、より効率の良い簡易データベースの仕様を思いついたのです。そこで、本家の検索アプリ用簡易データベースも次期アプリの開発に向けて仕様変更しようと考え、いろいろと検討をしておりまして…ほぼ固まった仕様について書いておこうと思います。
まずは検索アプリのこと
まずは簡易データベースを用いた検索アプリの仕様から。テキストファイル1つを1行にまとめ、1日に数十のテキストファイルを1ファイルにしてから、さらに1年ごとにまとめて簡易データベースを作成し、それを全文検索できるというものです。強力なAND検索とOR検索機能を有しており、仕事上で大いに役立っております。社内のサーバーに保存していた2001年から2012年2月現在(約166,000個のテキストファイル)から検索できるのが強みです。
ただし、検索速度はマシンパワーに依存します。過去1年分の検索だと、参照する簡易データベースは1ファイル(約12MB)になり、これを読み込んでから検索をかけるので、読み込みの時間がマシンパワーに比例しているようです。ですので2001年から現在までの検索ですと、1年ごとに約12MBのテキストファイルをロードして検索し結果を変数に溜めていくのでさすがに時間がかかります。私が仕事で使っているWindows98SE、Pentium3 999MHZ、メモリ512MB、HDD20G(7200回転)ですと1年分の検索が3秒ほどかかりますので、検索終了から結果表示までに40秒ほどがかかることになります。それでも以前の環境に比べるとずっとラクなので文句を言う人がおりませんけれども。開発した私としては、現状で満足してはいけないので、さらに速度を改善する必要があると思ったのです。
見直したのは、純正の拡張プラグインを使っている検索処理とは違い、自前の処理の部分。その中で1行ずつ処理するところで時間がかかっているのではないかと考え、簡易データベースの仕様を変更することにしたのです。
実はすでに一度、簡易データベースの仕様変更を行っておりまして…。この時は古い順番から格納していたテキストデータを新しい順から格納するようにしました。なぜならば検索結果は新しい順に表示するため、簡易データベースも新しい順番にしたほうが効率がよいからです。
今回で2度目となる簡易データベースの仕様変更では…1行1ファイルのテキストの格納方法を改めます。以下に従来の例を示します。
<;txt120217>;<;header>;¶ファイル名…AAA#NO-01<;/header>;¶¶<;txtname>;¶テキストのタイトル1¶テキストのタイトル2¶<;/txtname>;¶¶テキストの内容…¶テキストの内容…¶¶<;picture>;¶参考画像があれば…ファイル名#写真の説明¶<;/picture>;<;txt120217>; <;txt120217>;<;header>;¶ファイル名…BBB#NO-01<;/header>;¶¶<;txtname>;¶テキストのタイトル1¶テキストのタイトル2¶テキストのタイトル3¶<;/txtname>;¶¶テキストの内容¶¶<;picture>;¶参考画像があれば…ファイル名#写真の説明¶<;/picture>;<;txt120217>; <;txt120217>;<;header>;¶ファイル名…CCC#NO-02<;/header>;¶¶<;txtname>;¶テキストのタイトル1¶<;/txtname>;¶¶テキストの内容…¶テキストの内容…¶テキストの内容¶¶<;txt120217>; <;txt120218>;<;header>;¶ファイル名…XXX#NO-01<;/header>;¶¶<;txtname>;¶テキストのタイトル1¶テキストのタイトル2¶<;/txtname>;¶¶テキストの内容…¶テキストの内容…¶¶<;picture>;¶参考画像があれば…ファイル名#写真の説明¶<;/picture>;<;txt120218>; <;txt120218>;<;header>;¶ファイル名…YYY#NO-02<;/header>;¶¶<;txtname>;¶テキストのタイトル1¶テキストのタイトル2¶テキストのタイトル3¶<;/txtname>;¶¶テキストの内容¶¶<;picture>;¶参考画像があれば…ファイル名#写真の説明¶<;/picture>;<;txt120218>; <;txt120218>;<;header>;¶ファイル名…ZZZ#NO-02<;/header>;¶¶<;txtname>;¶テキストのタイトル1¶<;/txtname>;¶¶テキストの内容…¶テキストの内容…¶テキストの内容¶¶<;txt120218>;
かなり分かりにくいですね(笑)。「¶」は1行にまとめるために改行を変換したものです。検索結果を取得し、テキストの内容を表示する際に改行コードに戻すようにしています。とりあえず分かりやすくするために改行を入れてみます。
<;txt120217>; <;header>;¶ファイル名…AAA#NO-01<;/header>; <;txtname>;¶テキストのタイトル1¶テキストのタイトル2¶<;/txtname>; テキストの内容…¶テキストの内容…¶¶ <;picture>;¶参考画像があれば…ファイル名#写真の説明¶<;/picture>; <;txt120217>; <;txt120217>; <;header>;¶ファイル名…BBB#NO-01<;/header>; <;txtname>;¶テキストのタイトル1¶テキストのタイトル2¶テキストのタイトル3¶<;/txtname>;> テキストの内容¶¶ <;picture>;¶参考画像があれば…ファイル名#写真の説明¶<;/picture>; <;txt120217>; <;txt120217>; <;header>;¶ファイル名…CCC#NO-02<;/header>; <;txtname>;¶テキストのタイトル1¶<;/txtname>;> テキストの内容…¶テキストの内容…¶テキストの内容 <;txt120217>; <;txt120218>; <;header>;¶ファイル名…XXX#NO-01<;/header>; <;txtname>;¶テキストのタイトル1¶テキストのタイトル2¶<;/txtname>; テキストの内容…¶テキストの内容… <;picture>;¶参考画像があれば…ファイル名#写真の説明¶<;/picture>; <;txt120218>; <;txt120218>; <;header>;¶ファイル名…YYY#NO-02<;/header>; <;txtname>;¶テキストのタイトル1¶テキストのタイトル2¶テキストのタイトル3¶<;/txtname>; テキストの内容 <;picture>;¶参考画像があれば…ファイル名#写真の説明¶<;/picture>; <;txt120218>; <;txt120218>; <;header>;¶ファイル名…ZZZ#NO-02<;/header>; <;txtname>;¶テキストのタイトル1¶<;/txtname>; テキストの内容…¶テキストの内容…¶テキストの内容 <;txt120218>;
一応タグについて説明しておきます。<header>の中はファイル名…AAA。後の「#NO-01」というのはグループ化されたテキストであることを示します。およそ3~6本くらいのテキストがそれぞれグループ化され、日によって変わりますがグループの総数は8~24程度になります。だいたい平均すると1日に50本程度のテキストファイルをまとめることになります。
<title>というのはテキストファイルの中についている見出し的なものです。タイトル1ならhtmlでいう<H1>、タイトル2なら<h2>…そんな感じ。テキストによってタイトルが1~4本くらい付きます。
テキストの内容…これはその名の通りテキストの中身です。現在の仕様ではタグは付けておりません。厳密なXML形式である必要もないですし、少しでも付けるタグを減らしてファイルサイズを小さくしたいので、今後も付けないかもしれません。
<picture>は参考画像があれば…そこにファイル名を入れます。ファイル名の後の「#」以降は写真の説明分です。このタグの中身は複数の画像ファイルに対応しています。
そして、新しい仕様へ…
さて、新しい仕様では、年月日の「年」が2桁になっているのを4桁に修正し、1日分のテキストファイルをひと組の<年月日タグ>で囲むことにします。下に例を示します。
<;20120217>;<;header>;¶ファイル名…AAA#NO-01<;/header>; <;txtname>;¶テキストのタイトル1¶テキストのタイトル2¶<;/txtname>; テキストの内容…¶テキストの内容…¶¶ <;picture>;¶参考画像があれば…ファイル名#写真の説明¶<;/picture>; <;header>;¶ファイル名…BBB#NO-01<;/header>; <;txtname>;¶テキストのタイトル1¶テキストのタイトル2¶テキストのタイトル3¶<;/txtname>; テキストの内容¶¶ <;picture>;¶参考画像があれば…ファイル名#写真の説明¶<;/picture>; <;header>;¶ファイル名…CCC#NO-02<;/header>; <;txtname>;¶テキストのタイトル1¶<;/txtname>; テキストの内容…¶テキストの内容…¶テキストの内容 <;20120217>; <;txt120218>;<;header>;¶ファイル名…XXX#NO-01<;/header>; <;txtname>;¶テキストのタイトル1¶テキストのタイトル2¶<;/txtname>; テキストの内容…¶テキストの内容… <;picture>;¶参考画像があれば…ファイル名#写真の説明¶<;/picture>; <;header>;¶ファイル名…YYY#NO-02<;/header>; <;txtname>;¶テキストのタイトル1¶テキストのタイトル2¶テキストのタイトル3¶<;/txtname>; テキストの内容 <;picture>;¶参考画像があれば…ファイル名#写真の説明¶<;/picture>; <;header>;¶ファイル名…ZZZ#NO-02<;/header>; <;txtname>;¶テキストのタイトル1¶<;/txtname>; テキストの内容…¶テキストの内容…¶テキストの内容 <;txt120218>;
そして、1ファイル1行だったのを1日分を1行にまとめてしまいます(笑)。こうすることで総行数が激減します。1行ごとに処理をしているため、さらなる速度向上が望めるのではないかと思います。また、年月日を正確にタグ付けする副産物として、特定の年月日のテキストを一覧表示させることができるようになります。
改善要望を聞くと…
このアプリをよく使っている人たちに意見を求めたところ「テキストファイルだけでなく画像も観ることができたら嬉しい」という意見をもらいました。現在のバージョンでは画像があるディレクトリに移動することはできるのだけれど、自分で確認しなくてはなりませんでした。しかし、参考画像ファイルはEPSのため、残念ながらHSPでは扱えない画像形式。そこで…EPSに変換する前のjpg画像をサーバーから引っ張り出して、それをプレビュー出来る機能を付けようと思います。
現在は色々な作業があるため、すぐにバージョンアップできないのが残念なところです。年明けに仕事使っているWindowsを入れ替えたところ、なぜか従来の「HSP3.2」が動かなくなり、「HSP3.3」で新規開発する必要に迫られているのです。しかも多用していた外部プラグインまでもが動作しないため、外部プラグインに頼らず基本・拡張命令と自作の文字処理モジュール「kurage_mod」を使って開発…というより移植する感じになろうかと思います。いずれにしても、時間を見つけてゆるゆると進めていきたいと思っております。