WEB相談室

Webページ作成に関しての何でも掲示板です。

タイトル:perl cgi Out of memory! エラー終了

0:[投稿] 芙蓉 [2006/05/16 14:31 ] [環境:w2k ie6 perl/5.8.3/x86_64-linux-thread-multi 2.6.4]

 いつも貴重なご示唆を頂き感謝しております。つきましては、

 平均300Kbのバイナリファイル50個のヘッダ書換えをするcgiですが
15個位で、Out of memory! エラー終了してしまいます。

 open,read,print,closeで、src読込み、ヘッダ書換え、dstn生成書出しの仕様で、
繰返し処理の変数は全て再利用していますが undefなど開放処理はやってません。

 大きなファイルの(サイズ伸縮する)変換処理に効率的な方法が見つからず、
ごみ掃除、変数用メモリ開放などの方法、
sysread,syswriteのIOバッファスキップ効用も良く解りませんので、
対策がありましたらご教示お願いします。


1:[回答] 通りがかり。 [2006/05/16 16:28 ]

現状のスクリプトを提示すれば、改善方法がわかるのではないでしょうか。


2:[回答] 芙蓉 [2006/05/17 13:08 ][URL]

通りがかりのお立ち寄りご支援頂き有難うございます
スクリプトは一寸長いので大略以下の通りですが、一応自己解決しました。

readサイズ10Mb固定としてたのを、((-s SC) - chk_size($scb,$and0_id)) に修正、
大きければ適当に読んでくれるはずとのズボラでした、
こま切れにして読むとか、バッファをその都度undefするとかのi-net上の記事があ
りますがどうも納得できません。
今回の修正でも大量処理すればいずれ破綻するんでしょうね。

for (glob("*.$ext")){
    open(SC,"$_");
    read(SC,$scb,8000);    # ヘッダサイズ不定のため適当に読込
    ..
    seek(SC,chk_size($scb,$and0_id),0); # ボディ先頭にシーク
    read(SC,$_,10000000);    close SC;
    open(CV,">tempf");
    print CV $tpb,$_;    close CV; # 新ヘッダと旧ボディ書込
    rename "tempf","$srcf";    
}
sub chk_size{ .. }


3:[回答] 通りがかり。 [2006/05/17 14:56 ]

一気に読み込んで処理をしようと思うから、メモリーが破綻するのです。

open(IN,"読込ファイル");
open(OUT,">書込ファイル");
while(<IN>){
#何らかの処理
#何らかの処理
#何らかの処理
print OUT "書込みデータ";
}
close(OUT);
close(IN));

というように、一行ずつ読み込みながら処理をすると、ほとんどメモリー
を食わずに処理できます。


4:[完了] 芙蓉 [2006/05/18 12:09 ][URL]

レンタルサーバのcpu-timeとの係り、というより面倒ということもあり一気
読み書きとしておりました。
初めて出合ったOut of memory!の対策、参考となり有難うございました。

回答(必須): 状態:

お名前(必須):

URL:




[戻る]