5月22日

2011/5/22作成

起床。プログラムはどうなったかなぁ、と思ったら途中で落ちてる。perlがエラーを吐くわけではなく、Windowsのレベルでプロセスが落ちてる。UNIXで言うところのコアダンプみたいな状態と思われる。ワトソン君が入ってたら起動するんだろうな。今は、マイクロソフトに症状を送信しますかというダイアログが出る。送ってもどうしようもないと思うけど、一応送信しておく。

ちなみに落ちたのはこれで2回目。うむむ。こんなん原因の追究のしようがあらへん。perlのバージョンを変えたことで発生したと思われるので、元の5.8系に戻して再度試してみる。が、やっぱり落ちる。特定のところで落ちるわけでもないし、メモリエラーとかかなぁ。ECCメモリ使ってるわけでもないし、これからの季節長時間処理は無理があるかな。

どうやってプログラムを速くしようか。問題の根本は二重ループになっているところがあるということなんだよな。O(n2)になっていて、しかも対象となるデータが5GB・9000万行と超巨大ということで、計算時間が爆発してしまっている。抜本的な解決方法としては、アルゴリズムを変更してO(n)とかになるといいんだけど、うまいアイデアはなかなかない。

とりあえず、一つ思いついたのは、配列データをループで処理しているところを、 map/grepで処理するように変更すること。perlで配列処理の常套手段ですな。すっかり忘れてたけど。これで多少速くなってくれるといいんだけど。

この際、プログラムが正確に動作しさえすればいいということで、ダーティな手法でも構わず取り入れていく。グローバル変数を多用してみたりとか。まあ、元々書きなぐりのプログラムなんで、そんなに綺麗でもなかったんだけど。この際保守性とかよりも、速く正確に処理できることが目標。

foreachのループをmapに書き換えてみたけど、処理速度変わらず。そんなうまい話は無いか。うむぅ。

それにしてもperlがよく落ちる。1時間くらい作業してると落ちるようになってくるんで、マシンを冷やすために1時間くらい落とす。その間、寝転がって天井見ながらプログラムを考える。1時間経ったら、また作業に戻る。なんか変なことになってるな。つうか、PCはけちっちゃダメだってことだな。ちゃんとしたのを買わないと。

私が翻訳に立候補してた「北京市アメリカ人殺害事件」は、結局削除になってしまった。「特筆性を示しての再立項を妨げません」ということだけど、事件自体そんなに特筆性が高いものではないからなぁ。どうしたもんだか。

lintで発見した、削除タグが貼り付けっぱなしの案件を存続希望として削除依頼に出す。削除タグは勝手にはがしちゃいかんからな。前に勝手にはがして怒られたし。依頼に出して議論して合意して、はじめてはがせる。面倒だけど、決まった手続きはちゃんとふまないとね。

正規表現をindex()に展開したら(もちろんループも展開してべた書き)、テストデータで5秒も縮まった。まじすか!これは面倒でもやる価値あり!perlの正規表現エンジンはかなり性能がいいという話だったけど、流石にindex()にはかなわんか。んー、でももしかして新しいバージョンではその辺の事情も変わっているのかな。しかし、index()に展開した方が遅くなるケースもあるなぁ。データに依存するか。うーん。

再びperlのバージョンを5.12.3に上げてみた。なんか、微妙に遅くなったような気が。。。なんでやねん。

正規表現のindex()展開については、どうやら数が少ない場合には有効という感じかな。なんでもかんでも展開すればいいというものではないらしい。([A-Za-z0-9]を62個のindex()に展開したが、かえって遅くなった)。逆に、正規表現を使うなら、出来るだけたくさん[]の中にぶち込んでやった方が速くなるみたいだな。それもそうか。

うお、use strictとuse warningsを外したら、それだけで更に5秒速くなった。開発時は必須としても、本番データを処理するときは外しておくべきだな、こりゃ。しかし、盲点だった。

perlIOを使って入出力時にencode/decodeをするようにしたら遅くなるかと思ったけど、意外と速度は変わらんかった。バイト列の方が処理が速いと思ったんだけど、最近は事情が違うのか。

プログラムを最適化するに従って、段々コードが短くなっていく。いや、それは多分正しいんだろうけれど、なんかさみしい。

一番処理が重い部分の高速化に手をつける。が、なすすべ無しというか。合わせて10行くらいしかないわけで、手のつけようがない。ほんの少し高速化はできたけど、本番データに対しては顕著な短時間化とはならないだろうなぁ。効果は無くはないだろうけれど。今日はもう遅いので、続きは明日にしよう。

と思ったんだけど、寝床の中で考えていたら色々アイデアが浮かんだので、起きだしてプログラム修正。絶対速くなるはず!と思ったのに、意外と効果は薄かった。なんでだろう。おまけに結果まで違ってくるし。うーん、原因追求は明日にしよう。


あおやぎのさいと2.0 新人うぃきめでぃあん日記