Beginner's Rock Official Website

犬土偶日記

海の近くに住みたい

BR日記の使い方

2004年11月16日

Perlが壊れた

公開日時: 不明

検索CGIのおかしかった部分を直した。無限ループみたいな処理を書いていた。処理が終わらなくなった時に、動かしたままスクリプトを修正して上書きしたらプロセスが終了しなくなった。タスクマネージャでperl.exeを強制的に終了させてもhttpd.exeを終了させても無駄。止めたその時はCPU使用率もメモリ使用率も元に戻るんだが、また同じCGIを起動すると前回の終わらなくなった処理が最初から発動する。しかも上乗せみたいな感じでメモリ使用量が倍になる。もう一度止めてまた動かしてみたらまたまたメモリ使用量が上乗せされて3倍になった。止まらない処理が積み重なっていくような感じ。いつまでもCPU使用率100%でどうにもならない。クソ重くてダメ。最初はPerlのCGIで検索するとこれぐらい重くなるのかとか思ってたんだが、どうやら死なないプロセスがどんどん溜まって行ってるせいだと気付いた頃にはもう自分のPC内でCGIを動かすことが不可能な状態になっていた。もはや自鯖での動作テストは無理。しかし他のCGIを動かす時は普通に動くんだ。どうやら該当CGIの名前とセットでどこかに何かが記録されてるようだ。Perlのバージョンも結構古いはずなのでこの際だからActivePerlを最新版に入れ替えてみようと思った。ActivePerlをダウンロードしてきてインストール。これで無事に動くかなと思ったらダメ。同じ症状が残ってた。どうやら旧バージョンと共通で使うファイルのいずれか若しくはレジストリに何かが記録されてるらしい。PerlをアップデートするんじゃなくてPerlを一度全てアンインストールしてから入れ直すのがいいかもしれない。でもめんどくさいからやめた。修正したCGIは自鯖で動作テストすることなく直接他所のサーバーにアップロードして動かすという暴挙に出た。そしたらアホみたいに快適に動いた。やはり検索アルゴリズムがおかしいとか効率が悪いスクリプトのせいで重いとかじゃなかったんだ。最初はデータファイルを全て配列に読み込んで、その配列にgrepをかける方式だった。酒飲みながら書いた時のやつね。これのループ脱出条件を書き間違えておかしな動きをさせてしまった。それで動かすたびに少しずつどんどん重くなっていったので、プロセスが終了しないんだと気付くまではやり方がおかしいんだと思って色々と検索方式を変えてみたりした。まずはデータファイルの中身をスカラー変数に格納して正規表現でマッチさせる方式に変更。しかし自鯖では動かなくなってるからこの処理でも快適に動かないと思い込んだ。で、Perlメモというサイトを見てみたら正規表現を使うよりindexという関数を使う方が速いと書かれていた。ためしにやってみるかと思い、ついでに検索対象を変更することにしてずいぶんスクリプトを書き換えた。全てのデータが記録されたファイルの中身を舐め回すのは明らかに無駄が多く、複数の検索語を入力されれば無駄なループが増えてますます重くなる。データファイル更新時に、検索対象として適当なデータのみを抽出して別のファイルに書き込む仕様に変更し、そのファイルをスカラー変数に読み込んでindexをかける方式にした。これならば登録時に一度だけ多少重くなるだけで、検索時には軽くなるはず。そこら辺でプロセスが終了してないことにやっと気付いた。気づいたというか気付かざるをえないような状態だった。CGIを起動するだけでいきなりメモリを200MB以上消費して止まるような状態になってたから。ここでCGI作成は中断してプロセスを何とか止める手段がないものかとGoogleで検索してみたりしたけどよくわからない。ここまできて諦めて他所のサーバーにアップして動作テストすることにしたのよ。で、このindex検索方式で恐ろしく快適に動いたので完成とした。本当は最初の配列にgrepの方式でも快適に動いたのかもしれないね。でもまぁいい。終わった。いろいろ入力してテストしてみたけどおかしな動作はない。検索語を記録して検索回数をカウントする仕組みを付けてくれとずいぶん後になってから追加注文されてたのを結構苦労して実装したんだが、その結果を表示するCGIもおまけで作ってみた。自鯖ではちゃんと動いた。しかし動作テスト用の向こうのサーバーでは動かなかった。iswebにUPしたら動いたので何かサーバーの設定が違うのか使えない関数があるのか、とにかく何らかの理由があるんだろう。何度もプログラムを見直して間違いがないことを確認し、Perl文法チェッカにかけてみてちゃんと動くことを確認したので今度こそ全て終了。

Info.
公開日時不明
本文文字数1933文字 (タグ込み)
URLhttps://orca.xii.jp/br/diary/diary.cgi?id=dogoo;date=20041116
Comments

コメントはありません。

コメント投稿フォーム
文字色              
  • 名前を省略すると「名無しBeginner」になります。
  • メールアドレスの入力は任意です。
  • 海外からのコメントスパム対策のため、表示された漢字の読みを必ず入力してください。
  • 本文は必須項目です。投稿する場合は必ず記入してください。タグは使えません。
  • 改行が1つ入力された場合は強制改行として処理されますが、2つ以上連続する改行は段落の終了として処理されます。
  • 本文の行頭に「>」のある文は引用としてマークします。引用でない部分の冒頭に「>」は付けないでください。
  • コメントの削除は管理者若しくは日記執筆者しかできません。書き込む時は注意しましょう。
  • 全部記入が済んだら投稿ボタンを押す前に一度読み直して推敲しましょう。