クローラーを改良する - PageRank計算

Rubyを使ってWebページのクローラを書いている。
クローラに要求される条件として、とにかく落ちないということ。異常なデータを読み込んだときなども、そのデータを破棄して処理をつづけてもらわなきゃいけない。数万のデータが欲しいのに、数百ページを読みこんで落ちてしまう程度では困る。
今日は同一ホストへの時間あたりのリクエスト数を制限する処理を実装したあと、ひたすらいかにプログラムを落とさずに処理を継続させるかということに注力していた。

今日出会ったプログラムの異常終了の原因

Stack overflow

再帰的な呼び出しでURLの正規化をしようとする関数で無限再帰。終了条件をきちんと設定した上で、whileループに展開

不正な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の勉強もしないと。