クローラーを改良する - PageRank計算
Rubyを使ってWebページのクローラを書いている。
クローラに要求される条件として、とにかく落ちないということ。異常なデータを読み込んだときなども、そのデータを破棄して処理をつづけてもらわなきゃいけない。数万のデータが欲しいのに、数百ページを読みこんで落ちてしまう程度では困る。
今日は同一ホストへの時間あたりのリクエスト数を制限する処理を実装したあと、ひたすらいかにプログラムを落とさずに処理を継続させるかということに注力していた。
今日出会ったプログラムの異常終了の原因
不正なURIスキーム
リンク先(href)が javascript:foobar みたいになっている場合や、 foo@bar になっている場合の例外処理。簡単のためにhttpに制限(httpsは無視)
timeoutの例外
TimeoutErrorはStandardErrorを継承していないので、rescue でTimeoutErrorあるいはその親クラスを明示してやらなきゃいけない
Queueのバグ
[BUG] queue 0x424010 freed with live thread(s) waiting みたいなエラーが出てプロセスが落ちる。シングルスレッドなのに、なぜかスレッドのオブジェクトが3つくらいエラー出力に表示されていた。QueueをやめてArrayを使うことで回避
Ruby処理系のバグ?(SIGILL)
ときどきよくわからないタイミングでSIGILLでプロセスが落ちる。SIGILLについて調べなければ。trapできない?まだ解決できていない
そろそろMPIの勉強もしないと。