こんばんは。いきなりですが、質問があります。
CGIで動的にHTMLを作成したのですが
あるページに多数ユーザが接続しようとすると
フリーズしてしまいます。
調査してみたところ、Perlが実行時にメモリを
多く確保しているためのようです。
また、そのページではフレームを使用しているため、
1ユーザに複数プロセスが起動されるので、
それもメモリ不足の原因ではと思っています。
メモリの使用量を下げようとしているのですが、
知識足らずなため、思うようにいきません。
どなたか良い方法をご存知でしたら、
教えていただきたいのですが。
よろしくお願いします。
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
あ、今見返していたらバグが。
すみません。sub my_function {
my ($bigbigbig_data_ref) = @_;
for my $data (@$bigbigbig_data) {
は
for my $data (@$bigbigbig_data_ref) {
ですね。
なんか読み返すと、tayahaさんを初心者と決めつけてるようなところ
があって…お気を悪くしたらごめんなさい。
もしご存知無かったら、ということなのですが…そうそう、
サブルーチンの返り値となる変数もmyして結構ですよ。
sub my_func {
my $abc;
....
return $abc;
}
my_funcを呼び出した側で$abcを使ってる場合はmy_funcを抜けても
$abcは掃除されることはありません。(my_funcを呼び出した関数が
終わったときに掃除されます)
要するに、基本的になんでもmyを付けましょう、ということです。
perl -w オプションとuse strict;を使いましょう。
グローバル変数についても
use vars qw(@MY_GLOBAL_ARRAY);
として、明示的にグローバルとして使う!と宣言してないものがあれば
警告してくれます。
No.2
- 回答日時:
いくつかチェックポイントはあると思います。
まず、そのCGIは本当に必要か。普段は静的なHTMLページを表示して、
情報が更新されたときだけそのHTMLページを更新するようなことです。
掲示板でも最近多いですよね。ただ見るときだけのときは「~xxx.cgi」
ではなくて「~/xxx.html」を閲覧するようなもの。それで済むなら
そうしましょう。
次に、やはりプログラムのシェイプアップでしょうか。これには、さまざま
な場合があるのでひとくちにご説明するのは無理ですが、よく見かける
ものを念頭にちょっとだけポイントを書いてみます。
・ファイルの中身を @data = <FILE> といった調子で丸ごと読みこんで
いる個所があったら、
while (<FILE>) {
}
の形に直しましょう。確保されるメモリが1行分で済むようになります。
・グローバル変数を多く使ってるならなるべく局所変数にしましょう。
$abcがforループの中でしか参照されないのだったら、
my $abc;
for $abc (@array) {
$abc = ....
}
よりも
for $abc (@array) {
my $abc = ....
}
のほうが、いいということです。ループを抜けるときに掃除されますから。
サブルーチンでも同様です。サブルーチンの中だけ使うのならそこで
my。
・サブルーチンを呼び出すとき、配列やハッシュを引数として受け渡しする
かわりにリファレンスを渡す。
&my_function(@bigbigbig_data);
....
sub my_function {
my (@bigbigbig_data) = @_;
for my $data (@bigbigbig_data) {
.....
}
よりも、
&my_function(\@bigbigbig_data);
....
sub my_function {
my ($bigbigbig_data_ref) = @_;
for my $data (@$bigbigbig_data) {
.....
}
の方がベターということです。Perlのサブルーチン呼び出しはコピーに
なります。上記の例であれば@bigbigbig_dataが丸ごとコピーされることに
なります。ここでリファレンスを渡すようにすると、リファレンスそのもの
だけがコピーされ、両方とも同じものを指す、すなわち余分なメモリを食わなく
なるわけです。まあこれは程度問題で、$abc = 123とかの小さいデータを
渡すときにもムキになってリファレンスにする必要はありませんが。
他にも、細かいテクニックはいろいろあります。(ラクダ本の後ろの
ほうにあるメモリを節約するテクニックについて解説した章も参考に
してください)
以上をやってもキツい場合、ちょっと細かいテクニックになりますが、
セマフォを使って制限できる場合もありますね。
乱暴に言えば、flockを一度に単数のアクセスに制限するものとするなら
一度に複数のアクセスを許すロックみたいなものです。
詳しくはperldoc -f semctlやperldoc IPC::Semaphoreをご覧ください。
OSによっては使えない場合もあります。
まあ、自前でロックファイルを作るような形で、セマフォにあたるものを
作成する方法もできなくはないでしょう。
20個なら20個のアクセスまでを許し、それを越えていたら20以下になるまで
スリープする、あるいはエラーページを吐いて終わるような仕掛けを。
あと、大胆に、CGIのいくつかを他のサーバにおいてそっちで起動するように
する方法もあるでしょう。
------
たしかにサーバ側でコネクションを絞る手もありますね。例えば
ApacheだとMaxClientsやMaxSpareServersで設定することになるんでしょうか。
でも1.3ぐらいだと、全体でのDirectoryごとに細かくコネクション数を
設定できなかったような記憶があります。CGI以外の静的ページについても
制限することになりますね。まあ、背に腹は代えられないってことですかね。
それとも最近のバージョンだと違うのかな?また別のサーバなら話はまったく
異なるでしょうね。
No.1
- 回答日時:
一般的にはwebサーバがわでマックスのコネクション数を設定できるので
それで制御しましょう。
もしwebサーバをいじれないのなら、perlプロセスの数をpsコマンドで数えて
多かったら「不可が高いです」だけだして即終了してしばらくまってもらうとか
そうすれば最悪の事態は確率的に回避できます。
でも、一番懸命なのはスクリプトをもう一度みなおして無駄に変数を
つかってないか確認してみましょう。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- iPhone(アイフォーン) iCloudのデータをiPhoneメモリに移動したい 1 2022/10/24 22:11
- Perl perlでリテラル値はメモリにどのように格納されているか? 1 2023/01/15 20:45
- CPU・メモリ・マザーボード Windows11アップデート後の不具合(メモリ不足)について 9 2023/01/04 11:34
- CPU・メモリ・マザーボード 【PCメモリ増設】メーカーによって相性は違うのでしょうか? 9 2023/08/25 21:37
- CPU・メモリ・マザーボード 「コンピューターのメモリが不足しています」と表示される 4 2022/12/14 02:43
- CPU・メモリ・マザーボード PCのメモリについて質問です 8 2022/10/04 09:35
- Outlook(アウトルック) outlook メモリ不足 1 2022/05/31 10:16
- その他(パソコン・周辺機器) Windowsマシン。USBタップの「自動切れ、再接続」がうざい。解決策は? 7 2023/01/25 08:27
- Windows 10 実装メモリとタスクマネージャーのメモリ使用量不一致について 4 2022/12/15 01:07
- Android(アンドロイド) galaxy s8+にUSBメモリ(type-c)を接続し、動画再生すると熱くなるのですが… USB 5 2022/06/24 17:21
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
スカラー変数をチェック
-
プロシージャとは
-
プログラミングについて。 1つ...
-
文字列を変数名として扱う方法
-
エクセルの当番表を作っていま...
-
チェックデジットについて
-
ネットワークループとルーティ...
-
どなたかこのプログラミングを...
-
VBA for i=1 to lastrow
-
画面を強制的に再描画させる方法
-
Perlで<select multiple>の複数...
-
python の素朴な疑問
-
QNo.3258883データベースから取...
-
【VBA】指定の範囲から特定の文...
-
リストボックスに縦スクロール...
-
while(*s++=*t++)の判定は?
-
perlで配列名を動的に作り出したい
-
イベントの発生を待つ
-
Escキーを押すと、中断する時と...
-
for文とforeach文について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBのReturnの使い方
-
ExcelVBAでのデータ型変換、も...
-
COBOLの日付操作
-
プロシージャとは
-
サブルーチン(共通の処理)の...
-
RFC822形式の日付を生成するサ...
-
流れ図・・・
-
Perl実行時のメモリ不足について
-
$#{スカラー変数}とは何を意味...
-
Perl・DBIでの汎用selectサブル...
-
${str}と$strの違いとは?
-
画面を強制的に再描画させる方法
-
VBAで3秒だけ時間を止めたい
-
VBAでの一時停止と再開の方法
-
どなたかこのプログラミングを...
-
Escキーを押すと、中断する時と...
-
UWSCの終了の仕方
-
エクセルの当番表を作っていま...
-
VBA for i=1 to lastrow
-
「偶数・奇数の和」のフローチ...
おすすめ情報