- ベストアンサー
Perlでファイル出力時にデッドロック(?)してしまいます
- Perl(5.005_03)で、約5000万バイトのテキストファイルを読み込んで、そのデータに変更を加えた後、別のテキストファイルに書き出すプログラムを作っています。
- テキストファイルへの書き出しは、16回に分けて約300万バイトずつ行っています。
- ファイルへの書き出しが半分も終わらないうちに、デッドロック(?)してしまうみたいで、書き出し中のファイルは途中のまんま、プログラムが終わってしまいます。いまは、出力ファイルを開く前に「print " ";」を入れることでとりあえず動いています。(それも、どうしてなのかわかりません・・・)何か良い方法はないでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
約5000万バイトというと、かなり大きなファイルですね。apacheの「Timeout」の設定(httpd.conf)はどうなっていますか?初期値は「300(秒)」になっていると思います。 「print " ";」を入れると正常終了するとのことですので、もしかしたら設定の問題かもしれませんよ。 ファイルの書き込みに300秒以上かかっているのなら、apacheの設定を変更するか、もしくは、定期的にhttpにアクセスしてタイムアウトになるのを防ぐ処理を入れてみてください。
その他の回答 (2)
- tfp
- ベストアンサー率37% (3/8)
直接関係あるか分かりませんが、 open OUT, ">>$file" || die "can't open : $!"; は、間違いですよ。 これですと、open に失敗した場合でも決して die が実行されることはありません。 Perl5以降 open は、リスト演算子の優先順位を持つので、例え $file が未定義だった場合でも、">>$file" という文字列が偽にならない限り、黙々と処理を進めてしまいます。 ただこの場合、たまたま追記オープンですから分かりづらいかもしれませんが、読み込みオープンで open OUT, "are" || die "can't open : $!"; を試してみれば、are というファイルがないにも関わらず die されないのが分かると思います。 正しく open の戻り値を期待するなら open(OUT, ">>$file") || die "can't open : $!"; と、括弧で囲む必要があります。 もしくは || の代わりにリスト演算子より優先順位の低い or を使ってやれば囲まなくても OKです。 また、close の戻り値もチェックした方が、よいでしょう。
お礼
ありがとうございます。 早速、修正しました。 でも、デッドロックと直接関係はないみたいです。(;_;)
- alicia-y
- ベストアンサー率40% (85/208)
もう一つ状況がつかめませんが、 ファイルの先頭に $|=1; を入れたら終了するのかな。 apache って書いて有るので CGI で動かしてるの? perl hogehoge.pl ってやると正常に終了するのかな。
お礼
ご回答ありがとうございます。 PerlはCGIで動かしています。 あと、「$|=1;」も書いているんですが。。。 perl *.pl はまだ試していませんので、試してみます。
お礼
ありがとうございます! bubu-chanのおっしゃる通り、apacheの設定が原因でした。 助かりました。ありがとうございました♪