人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

Perl 5.8を利用しています。

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

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

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

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

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

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

●質問者: zachouR
●カテゴリ:コンピュータ インターネット
✍キーワード:Perl エラー システム データ プログラム
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● nev
●23ポイント

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

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

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

◎質問者からの返答

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


2 ● Likkradyus
●23ポイント

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

◎質問者からの返答

ありがとうございます、

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

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


3 ● yosuke_ss
●22ポイント

http://hpcgi1.nifty.com/monsfct/ura/link1.cgi

◎質問者からの返答

ありがとうございます


4 ● b-wind
●22ポイント

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

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


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

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

404 Blog Not Found:perl - Devel::Leak

◎質問者からの返答

ありがとうございます。

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

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ