Perl 5.8を利用しています。


今、24時間動き続ける、あるプログラムを作っています。

起動して実験をしてみたのですが、どうも途中で「システムリソースが少なくなりました」エラーが出てきてしまいました。

変数に関して、データがたまっていかないようにしているつもりですが、やはりエラーが出てきます。

少し調べたところ、使い終わった変数はundefをした方がいいと書いてありました。が、これは正しいのでしょうか?

みなさんは、長時間動き続けるプログラムを書く場合、変数に関してどのような事に気をつけていますか?

教えて頂けると幸いです。

回答の条件
  • URL必須
  • 1人20回まで
  • 登録:2007/07/24 19:20:18
  • 終了:2007/07/31 19:25:20

回答(4件)

id:nev No.1

nev回答回数77ベストアンサー獲得回数42007/07/24 22:54:59

ポイント23pt

Perl は、その変数への参照が無くなるとガベージコレクトされます。

システムリソースが少なくなりましたのメッセージが出るということは、前回のループの変数への参照が無くなっていないのではないでしょうか。

http://q.hatena.ne.jp/1185272416

id:zachouR

前回のループの参照と言うことは、プログラム内に置いてある、whileやforeach内にある、変数に何かが蓄積されているということでしょうか?

2007/07/25 10:06:13
id:likk No.2

Likkradyus回答回数8ベストアンサー獲得回数02007/07/25 13:32:38

ポイント23pt

24時間稼動のプログラムは作ったこと無いので、(times関数の返り値が一定以上になったら再起動するようにしてます)

あまり参考にはならないかもしれませんが、個人的に気をつけていることは

・まず、大量のデータ長を流す場合は本当に全体が必要なのか、検討する。

・グローバル変数は極力使わない。

・my変数と{}ブロック要素を使い、変数スコープの範囲を限定させる。

ですかね…


(処理)

{

my @hoges = (多量のデータ)

foreach my $hoge (@hoges){

#$hogeが参照できるのは foreach内だけ

}

} #このブロックを抜けると @hogeは参照されなくなる(@hogeのリファレンス作成とかしなければ…)

(処理)


のような感じで。

あと配列、ハッシュの場合は、

$hoge[1] = undef もありですが、必要に応じてdelete関数(ハッシュ)や shiftやpop、スライスによる代入(配列)などを、

全体を初期化する場合は %hoge = undefではなく %hoge = ()を使ってます。

(URLが必須だったので、ダミーのURLです)

http://q.hatena.ne.jp/1185272416

id:zachouR

ありがとうございます、

Linuxの場合は問題なのですが、windowsでは、どこをどうしても何かがたまっていくようです。

ありがとうございました。

2007/07/26 17:31:56
id:yosuke_ss No.3

yosuke_ss回答回数260ベストアンサー獲得回数22007/07/26 01:50:02

id:zachouR

ありがとうございます

2007/07/27 22:58:20
id:b-wind No.4

b-wind回答回数3344ベストアンサー獲得回数4402007/07/28 09:40:27

ポイント22pt

ちゃんと変数のスコープは明示していますか?

my をつけることで undef を使わなくてもスコープを抜けた時点で変数は開放されます。


あとはどうしても発生するややこしいメモリリークは、Devel 系のモジュールを使って探し出す事が出来ます。

nDiki: [ WiKicker ] eval "use ..." (2004-01-23)

404 Blog Not Found:perl - Devel::Leak

id:zachouR

ありがとうございます。

my はつけています。抜けた時点で解放されるというのは知っていたのですが、なにかが原因でどんどん利用しているメモリが増えていくのです。

最終的には、プログラムを改造しバッチファイルなどを利用して、見た目には動き続けているが実際は5分ごとに終了しているという処置をとり、回避できました。

モジュールは研究してみます。

2007/07/30 09:58:58

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません