Hyper Estraier : P2Pを試してみた
HyperEstraierのP2Pガイドに従って試してみたので、めも。
とりあえず、試したのはWindowsPC1台のみの環境で、
P2Pガイドに従い文書ドラフト(.est)ファイルを用意して読み込ませる方法を試した。
実際に試してみて、生成されたフォルダを確認してみたところ、
casket\_node\data001
というフォルダ構成になっていて、data001の中を覗いてみると、
なにやら見覚えのあるファイルが。
そこで、既存のHyperEstraierのインデックスファイルを、
P2P用に生成されたフォルダに上書きしてみたら、普通に使えました。
そこで次のステップとして、前回ハマッタ1600万件以上のインデックスを
100万件ごとに区切ったインデックス、20個をP2Pに食わせてみました。
その結果、やっぱり fetal error : out of memory で落ちた。
インデックスが1600万件を超えるような場合では、
PCを複数台用意してインデックスを分けてやる必要がありそうです。
今日の収穫は、
P2P用のインデックスフォルダにHyperEstraier用のインデックスが
そのまま流用可能だと分かったこと。
やっぱりPC複数台用意するしかないかぁ...
Hyper Estraier : fatal error out of memoryの調査
約100万件のインデックスを20個ほど個別に生成したものを、
estcmd mergeでひとつのインデックス(合計2000万件)にまとめようとしたところ
fatal error out of memoryで落ちてしまう件の調査。
現象としては、16個のインデックスをマージしている最中、
wnum(語句?)の登録の1回目で落ちる。
使用しているアプリは、公式版 windowsバイナリ1.4.10のもの。
HyperEstraierから呼び出しているQDBMのDLLでエラーが出ているらしい。
ということまでは先日の調査で分かっている。
ふと、HyperEstraier最新版の1.4.13で試したらどうなのかな?と。
やってみた結果、やっぱり落ちた。
落ちた時点でのマージ途中のインデックスフォルダのサイズは約10GB
estcmd repairで復旧を試みるも、こちらもやはり
fetal error : out of memory と出て落ちる。
ソースコード確認してもmalloc()でメモリ確保してるところでこけているらしい。
メモリは十分に空いてるのに...なぜ?
最初からマージしていると、現象が再現するまでに10時間とかかかるので、
とりあえず、手っ取り早く現象を再現させる方法を考えないと。
Hyper Estraier : estcmd merge で fatal error out of memory発生
約1800万件程度のデータベースを作りたくて試行錯誤。
ひとつのデータベースサイズを約100万行で区切って生成し、
それを、estcmd mergeでひとつにまとめるという目論見だったが、見事に玉砕。
1500~1600万件ほどのマージに差し掛かったところで、
fatal error out of memory を吐いていて、バッチ処理が止まってた。
サイズに上限があるのかしら?
1000万件と800万件のデータベースに分けて、ユーザーに使い分けてもらう...
というのは論外なので、Hyper EstraierのP2Pというものを試してみようと思う。
P2Pの説明によると、100万件のデータベースを10個用意して、
1000万件のデータベースとして扱える...と書いてあって、期待が持てる。
いやぁ~休日前にバッチ処理仕込んでおいて、休み明けにデータベースできてるかなぁ~とワクワクしながら職場に行ったらfaltal error で落ちてるとか、涙目でした。
Hyper Estraier : 自作gatherで異常終了する件の調査
自作gatherで1GB程度のファイルリストを読み込むと、半分くらい処理したところで
fetal error吐いて落ちる件、どうにも腑に落ちないので調べてみた。
エラーを吐いている箇所は、
HyperEstraierのDLLから呼び出している、
QDBMというデータベースを制御する別のDLL内部だと言うところまでは分かった。
でも、そこまでしか分からず。
とりあえず、先日の出力データベースファイルを小分けにする対策で
やりたいことは出来ているので、しばらく様子を見てみることにした。
Hyper Estraier : gather っぽいものを作ってみた。
思うところがあって、gather 機能的なものを作ってみたので、その記録。
文書ドラフト(.est)ファイルを1000万件(ファイルサイズは1kB程度)ほど、作って、
estcmd で読み込んでデータベースを作ろうとしたんだけれども、
1000万件分の文書ドラフトファイルを生成する処理だけで、数日かかりそうなことが分かって、別の方法がないかなと。
元ネタファイル→文書ドラフト(.est)→Hyper EstraierのDBファイル。
としたかったが、文書ドラフト(.est)を作るのをやめて、
元ネタファイル→Hyper EstraierのDBファイルと出来ないかな? と。
WindowsバイナリのHyper Estraier 1.4.10をダウンロードして、
そこに含まれているDLLを拝借して、オレオレgather的なものを作ってみた。
gatherの作り方は、プログラミングガイドのサンプルコードを拝借。
http://fallabs.com/hyperestraier/pguide-ja.html
速度は文書ドラフトを作らないだけあって速い。
実際に動かしてみると、元ネタのファイル1GBを半分くらい
(ドラフト文書相当数だと、だいたい220万件程度を)処理したところで
> fatal error : memory corrupt
とか出てきてアプリが落ちた。
メモリ使用量は、500MBくらいで、4GBのメモリの3GB以上空いている状態。
原因はメモリ不足ではなさそう。
原因追求する時間が惜しかったので、とりあえず入力ファイルを小さく分割して、
それぞれに対応する小さなデータベースファイルを出力するようにしたら無事最後まで処理完了。
あとは、Hyper Estraier付属のestcmd.exeで
複数のデータベースをマージしてひとつの巨大なデータベースにするだけ。
途中でハマって処理方法を変えたので、自作アプリを作り直すはめになったけど、
当初の目的が何とか達成できましたとさ。
Hyper Estraierはドキュメントが充実していて、ほんとうにありがたいです。
Hyper Estraier : estcmd gather 実行速度
ローカルHDDにある文書ドラフトファイルをgatherで読み込んだ際の実行速度
30万件/h くらいだった。
200万件弱くらいの文書ドラフトで確認。
Hyper Estraierのフォーム
フォームのメモ
付属のestseek.confファイル中の
formtype: nomal
と書いてある箇所を、
formtype: file
とか、
formtype: web
と、変更するとフォームが変わります
formtype: nomal とした(標準)フォーム↓
formtype: file としたフォーム↓(body text, file pathボタンが増えている)
formtype: web としたフォーム↓(titleボタンが増えている)
ほんと、Hyper Estraierって至れり尽くせり感が凄い。