モジュールを使うときの負荷

このQ&Aのポイント
  • CGIを作成するとスクリプトのサイズが大きくなってしまい、負荷が増えてしまいます。
  • モジュールを使う場合、大容量のモジュールを読み込むことでプログラムのサイズや負荷が増えます。
  • データベースを使用する場合、処理方法によって負荷の軽減が可能ですが、1ファイルずつデータを取る場合は手間がかかります。
回答を見る
  • ベストアンサー

モジュールを使うときの負荷

変な質問かも知れませんが宜しくお願いします。 CGIを作り、改良や新機能を追加するごとにスクリプトが膨らみ ファイルサイズが大きくなってしまいます。 その負荷を抑えるために、よく、 if分岐で必要に応じたパーツをrequireで読み込んで使っています。 これはとても効果があって本当に頻繁に使うのですが、 今回、モジュールを使いたいと思っています。 しかし、モジュールを使うときには、 useで宣言するのですよね? これでモジュールをインクルード出来る。と本には説明されています 問題はこのとき、結構な容量のあるモジュールをuseで宣言すると、 例えば、50kbの本体プログラムで 100kbのモジュールを使うと 宣言すると、もれなく150kb分のプログラムを動かしている状態に なってしまうのでしょうか? データベースなどを取り扱いたいのですが、use宣言しただけで 大きなモジュール分の負荷がかかるのであれば、悩みます。 どなたかお教え下さい。 また、こういう場合でも動作を軽くする方法があれば、そちらもお教え下さい。 データベースを使って処理するのと、面倒でも1ファイルずつOPEN、closeで split処理してデータを取るのとどちらが良いかかなり悩んでいます。 今回扱うデータがかなりの大きさになるもので・・・^^;; 変な質問ですが宜しくお願いします。

  • Perl
  • 回答数2
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • noopee
  • ベストアンサー率38% (114/297)
回答No.1

こんにちは。 サーバへの負荷を考える場合、ファイルサイズはそんなに重要なことでしょうか?? ieyasuさんがどのくらいのスペックのサーバをお使いかわかりませんが、少々のファイルサイズを気にされるのであれば、サーバのアップグレードの方が現実的だと思います。 それともM単位に及ぶほどのcgiなんでしょうか? 問題はファイルサイズよりプログラムの内容です。 モジュールはプログラムを効率よく使うためのツールだと認識しています。 モジュールを使うことによる負荷より、そのモジュールと同じことをプログラムに記述して実行する負荷の方が大きいと思います。 時間のかかる処理でしたら、モジュールを使う方が負荷も少ないと思います。 扱うデータがかなりの大きさになるってことですが、具体的にどのくらいでしょうか? ヘタにデータベースを使うとテキストファイル等で処理するより効率が悪くなる場合もありますが、かなりの件数ってことでしたらデータベースを使われた方がその後の拡張もしやすいはずですし、検索スピードも速くなります。 100M超えるようなファイルになってくると、書き込むだけで結構負荷もかかるし安定性も悪くなると思うんですけど...。 ヘタにテキストで作ってしまって、後からデータベースに移行するのがめちゃめちゃ大変だったこともあります。 どのデータベースをお使いになるかによってまた変わってきますが、モジュールによってスピードが速いものもあったりします。 少々のモジュール使用での負荷より、恩恵の方が大きいと思いますよ。

ieyasu
質問者

お礼

丁寧なご教授ありがとうございます。 プログラムが、ゲームCGIで、頻繁に更新するタイプの物ですので 毎回50KB読み込むのと、150KB、200KBと多く読み込むのでは かなりスピードに差がでているのが現状なのです。 プレイヤーのコマンド次第では、最小20~30KB程度のプログラム実行で 済ませるのが理想なのです。 細部にわたって、if(!$~)を unless($~)に変えるとか、 リファレンスを使ってメモリ節約するといいのかもしれませんが。。。 現在レンタルサーバーで、現行のものですら負荷限界の連絡を受けているもので、 モジュール使用でどう変わるのかに関心がありました。 結論としましては、スピードの優劣はどうであれ、インクルードするというのは モジュール分のスクリプトを上乗せした、と考えれば良いのですね? もしかして、useも、requireと同じく、プログラムの途中で if(~・・・){use~・・・} と条件分岐で使用する、ということも可能なのでしょうか? 

その他の回答 (1)

  • noopee
  • ベストアンサー率38% (114/297)
回答No.2

こんにちは。 >インクルードするというのはモジュール分のスクリプトを上乗せした、と考えれば良いのですね? それはちょっと違います。 特に宣言しただけで上乗せ、というのはかなり誤解だと思います。 語彙不足でなんと説明したらぴったりくるのか分からないのですが...。 お礼の内容からして、かなりスピードに悩んでらっしゃるようですね。 スクリプトをコンパクトにするというのも一つの手なのですが、FirstCGIなんかで常駐させるともうちょっと速くできます。 あとはPHPを使うとか...。 あくまでperlでということであれば、FirstCGI+PostgreSQLまたはMySQLの方が、かなりなデータ容量でしたらより速くできるのではないでしょうか? データベース接続のモジュールもDBI+DBDなどはある程度速いと思われます。

参考URL:
http://member.nifty.ne.jp/hippo2000/perltips/

関連するQ&A

  • 一括してモジュールを読み込みたい

    最近Perlを始めました。(今まではPHPをやっておりました) 利用するモジュールを各CGIファイルごとの先頭に宣言するのが面倒なので、Include.plなどのファイルを作って一括して読み込みたいと考えています。 例えば以下のような感じです。 【Include.pl】 use strict; use Data::Dumper; use Fcntl qw(:DEFAULT :flock); use CGI; use CGI::Session ; use CGI::Carp qw(fatalsToBrowser); use Encode; use HTML::Template; 1; 上記のようなファイルを各CGIファイルの先頭で、 require 'include.pl'; とした場合に、使用できないモジュールがあります。 例えば、ファイルロックをしたくてflock(FILE, LOCK_EX)とするとエラーになってしまいます。 しかし、CGIモジュールは$q = CGI->new()と普通に利用できます。 モジュールは全てインストールされています。その証拠にCGIファイルに直接useの宣言を書けば動作します。 通常、このような使い方でモジュールのuseは有効にならないのでしょうか?? また、自分で作成したモジュール内で他のモジュールを利用したいといった場合、いちいちuseで宣言しなければならないのでしょうか。 mainとなるファイルでuse宣言しておくだけで、自作モジュール内で利用できると思ったのですが、いちいち宣言しなおさなければ利用できないようです。 挙動がPHPと違うため困惑しております。 どなたかご教授いただけないでしょうか。よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • モジュールのメリット、デメリットについて

    Rubyでいろいろなツールを作っているのですが、共通するプログラムを抜き出して別のファイルにしようとしています。 今までは、xxx.rbに共通するプログラムを集めてrequireで読み込んでいたのですが、 webとか「たのしいRuby」を調べていたらモジュールとかがあるのがわかりました。 それで、モジュールを使って(モジュールにまとめて)みようと思ったのですが、 何か、メリットやデメリットはあるのでしょうか?

    • ベストアンサー
    • Ruby
  • パッケージとモジュールについて

    こんにちは。Perlを学習し始めた初心者です。 Perl 5.87を使っており、標準モジュールを使う方法を書籍で読みました。 例えば、フォームに入力、送信されたデータを処理するために use CGI; と最初に記述して使うことができますが、 別のエラー処理の構文を見ると $CGI::POST_MAX と1行目に記述してあります。 パッケージとモジュールの概念が、よく分かっていないので戸惑って います。 C:\perl\lib にある、CGI.pmというモジュールを使用していると思う のですが、use CGI;と記述するときと $CGI::と記述するとき、何が異なるのでしょうか? 後者はCGI.pmの中にある、POST_MAX変数を使うということでしょうか? パッケージという言葉を見ても、よく分からずネットで随分調べましたが、余計に分からなくなってしまいました。 お忙しいところ申し訳ありませんが、よろしくお願い致します。

    • ベストアンサー
    • Perl
  • ExcelVBAモジュールのコピーと削除

    ExcelVBAで教えて下さい。 同じようなデータ形式のファイルが年度ごとにあるので、それを処理するモジュールを作成しました。 私は雛型を作っただけで、実際のファイルの処理をするのは他の人なのですが、雛型ファイルに付いているコードが書かれた「モジュール」は、VBAの画面からのドラッグでのコピーしかできませんか? また、処理を実行後はモジュールを削除したいのですがそのようなことは可能でしょうか?コードで書けるのでしょうか?もし可能でしたら教えていただけますと幸いです。 初歩的な質問で申し訳ありませんが、よろしくお願い致します。

  • phpでのサーバー負荷について

    お世話になります。 phpで外部テキストファイルを読み込ませる場合、 requireとforeachではどちらがサーバー負荷が大きいのでしょうか。 $log = "./logfile.txt";(せいぜい、マックス5行程度です) <内容> 1,タイトル1,コメント1, 2,タイトル2,コメント2, 3,タイトル3,コメント3, 4,タイトル4,コメント4, 上記のものを、そのままforeachで1行ずつループさせて表示させる方法と foreach($log as $data){ $data = split("\,", $log); print "<li>$data[0]<span>$data[1]</span></li>"; } これを数時間に1回程度、バックグランドで稼動させて、 別のファイル(hoge.txt)に以下の形で保存させておいて <hoge.txtの内容> <li>タイトル1<span>コメント1</span></li> <li>タイトル2<span>コメント2</span></li> <li>タイトル3<span>コメント3</span></li> <li>タイトル4<span>コメント4</span></li> require("./hoge.txt"); で読み込ませた方が負荷は少ないのでしょうか。 現在、foreachでやっているのですが、 あまり頻繁に変更される部分ではない為に、 ページを開くたびに毎回foreachでループさせるよりも 後者の形で読み込ませた方がサーバー負荷が多少でも少なくなるようでしたら 後者に変更しようと思うのですが、どうでしょうか。 お手数をおかけしますがもし宜しければご教授いただけますと幸いです。

    • ベストアンサー
    • PHP
  • ExcelVBAでモジュールを送る

    ちょっとわかりにくいかもしれませんが、モジュールのコピーをマクロでできないものでしょうか? ExcelVBAで二つのファイルを使っています。Aという何のデータも入っていないファイルなのですが、実はそれにモジュールが書いてあり、それ専用に使っています。 CSVデータを変換したり、図形を描いたり、グラフを作るプログラムが書いてあります。 そのAファイルを使ってCSVデータ「Bファイル」を起動します。BファイルはダウンロードしてきたCSVファイルです。 Aファイルは常に個人個人がもっているのですが、CSVはネット上からダウンロードしています。 当然Aファイルが常に起動していないと、Bファイルだけでは「CSV変換」や「図形描写」ができないのわけです。「CSV変換」は最初の1回で終わる話ですが、「図形描写」「グラフ作成」はその後何度もすることがあります。 単にBファイルからマクロのインポートなどをすれば済むのかもしれませんが、数多くの使用者の中には「マクロのイン・エクスポートができない」とか「めんどくさい」という方がいます。外部にデータを引き渡す際に、AとBの両方送らねばならなくなってしまいます。 で・・・お伺いしたいのはマクロで「Aファイルのモジュール」を「Bファイルの中にコピー」できないか?ということなんです。 Aファイルでボタン一つを押せば、すべて整う環境にしたいのです。 逆に「AファイルにBのCSVデータをコピーして、そこで使うようにすれば?」と聞いたのですけど、それはどうしても出来なかったときの最低ラインとし、出来れば「Aのモジュール→BのCSV」に行きたいのだそうです。 マクロでモジュールのコピーというのは・・・出来るものなのでしょうか?よろしければ教えてください。

  • Python クラスとモジュールの違いについ

    プログラミング初心者です。※初めてのプログラミングでPythonの勉強中です。開始2週間程度です!! Pythonにおける(プログラム一般における?)クラスとモジュールの違いが分かりません。 ■現状の認識 ・モジュール 「***.py」といったような一つのファイル 他のモジュールからimportすることによって使用できる ・クラス 「***.py」といった一つのファイルの中に「class」として宣言できる 他のモジュールからインスタンスを生成して使用できる ■疑問点 上記を使い分ける意味 上記を使い分けた時のメリット、デメリット ※すべてモジュールとして作成して、使用したいときにimportすればいいのでは?と考えています。 現状Pythonの知識しかありませんが、プログラミング一般の知識のような気がしています。 プログラムに詳しい方よろしくお願い致します。

  • モジュール間のデータ受け渡し

    初心者質問で申し訳ございませんが、 ご教授、お願いできませんでしょうか? 環境は XP, VB,net2005を使用しています。 言葉が適切かどうかわかりませんが、 別ファイルのモジュール同士でのデータの受け渡しはどのように行えばいいのでしょうか? たとえば、Form1.vbに定数宣言してある「定数1」を 別で作成したModule.vbには定数を読み込むにはどのように行ったらよいのでしょうか? パブリック変数の位置で宣言したのですが、参照できないようで… ご回答いただけましたら幸いです。

  • 外部ファイルの読み込みにrequireを利用し、指定ファイルパスをスカ

    外部ファイルの読み込みにrequireを利用し、指定ファイルパスをスカラー変数で行うとエラーとなる ファイルには、外部実行の格納ファイル名が入っています。 処理をしたいことは、指定ファイルにある変数を利用して、外部ファイルを実行することです。 実行すると以下のエラーを出しています。 ------------------------------------------------------------------ Software error: Can't locate ./$cfl/puls.cgi in @INC ...略 ------------------------------------------------------------------ プログラムは以下の内容です。 ------------------------------------------------------------------ 省略 open(DATA,"$file")|| die &error(" $file を読み込みopen出来ません"); flock(DATA,1); @lines = <DATA>; foreach $line(@lines){ ($afl,$bfl,$cfl,$efl,$y3) = split("<>", $lines1); require './$efl/puls.cgi'; } close(DATA); 省略 ------------------------------------------------------------------ そもそもrequireでスカラー変数が使えないのか? そのあたりも調べてみたのですが分かりませんでした。 また今回の方法以外にやり方がございましたらご指導頂きたく書き込みいたしました。 お手数かけます。 よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • CGI のモジュールをつかってファイルのアップロード

    use CGI qw(:standard); use File::Basename; $upimg1_pm = param('upimg1'); while (read($upimg1_pm, $buffer, 2048)) { $file .= $buffer; } $FileName = basename($upimg1_pm, ""); open UP,"> $img_dir/$FileName"; binmode UP; print UP $file; close UP; 上のようにファイルのアップロードのプログラムを書いたのですが、実際アップロードしたら C:\Documents and Settings\~top.gif のようにWindowsのローカルパスがそのままファイル名としてアップロードされてしまいました。 basenameはファイル名をとるモジュールときいていたのですがなぜこうなるのでしょうか? おそれいりますがご教授おねがいします。 もしかしてFile::Basename;のモジュールがないとか・・・ Perl5です。

    • ベストアンサー
    • CGI

専門家に質問してみよう