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

データベースを使って処理するのと、面倒でも1ファイルずつOPEN、closeで
split処理してデータを取るのとどちらが良いかかなり悩んでいます。
今回扱うデータがかなりの大きさになるもので・・・^^;;

変な質問ですが宜しくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

こんにちは。



サーバへの負荷を考える場合、ファイルサイズはそんなに重要なことでしょうか??
ieyasuさんがどのくらいのスペックのサーバをお使いかわかりませんが、少々のファイルサイズを気にされるのであれば、サーバのアップグレードの方が現実的だと思います。
それともM単位に及ぶほどのcgiなんでしょうか?
問題はファイルサイズよりプログラムの内容です。

モジュールはプログラムを効率よく使うためのツールだと認識しています。
モジュールを使うことによる負荷より、そのモジュールと同じことをプログラムに記述して実行する負荷の方が大きいと思います。
時間のかかる処理でしたら、モジュールを使う方が負荷も少ないと思います。

扱うデータがかなりの大きさになるってことですが、具体的にどのくらいでしょうか?
ヘタにデータベースを使うとテキストファイル等で処理するより効率が悪くなる場合もありますが、かなりの件数ってことでしたらデータベースを使われた方がその後の拡張もしやすいはずですし、検索スピードも速くなります。
100M超えるようなファイルになってくると、書き込むだけで結構負荷もかかるし安定性も悪くなると思うんですけど...。
ヘタにテキストで作ってしまって、後からデータベースに移行するのがめちゃめちゃ大変だったこともあります。

どのデータベースをお使いになるかによってまた変わってきますが、モジュールによってスピードが速いものもあったりします。
少々のモジュール使用での負荷より、恩恵の方が大きいと思いますよ。
    • good
    • 0
この回答へのお礼

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

結論としましては、スピードの優劣はどうであれ、インクルードするというのは
モジュール分のスクリプトを上乗せした、と考えれば良いのですね?
もしかして、useも、requireと同じく、プログラムの途中で
if(~・・・){use~・・・}
と条件分岐で使用する、ということも可能なのでしょうか? 

お礼日時:2002/03/23 14:12

こんにちは。



>インクルードするというのはモジュール分のスクリプトを上乗せした、と考えれば良いのですね?
それはちょっと違います。
特に宣言しただけで上乗せ、というのはかなり誤解だと思います。
語彙不足でなんと説明したらぴったりくるのか分からないのですが...。

お礼の内容からして、かなりスピードに悩んでらっしゃるようですね。
スクリプトをコンパクトにするというのも一つの手なのですが、FirstCGIなんかで常駐させるともうちょっと速くできます。
あとはPHPを使うとか...。
あくまでperlでということであれば、FirstCGI+PostgreSQLまたはMySQLの方が、かなりなデータ容量でしたらより速くできるのではないでしょうか?
データベース接続のモジュールもDBI+DBDなどはある程度速いと思われます。

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

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

Quse strictを宣言してlocal変数を使うには?

Perl初心者です。初歩的な質問ですが、
サブルーチンの中で my だと、その下の{ }
ブロックではmyで宣言したローカル変数がスコープされないので 
localを使うのではないかと思いますが、
それだと、use strictではエラーになります。
こんなときどう処理したらよいのでしょうか。

Aベストアンサー

> なんか、よい本などあればご紹介していただけたら、ありがたいなと、思います。

私は以前、文法が Perl とかなり似ている C/C++ で仕事をしていたので、覚える時にはリファレンス(「CGI&Perlポケットリファレンス」技術評論社)くらいしか必要ありませんでした。
そのため、入門書として推薦できる本を残念ながら知りません。

変わりに技術系書籍のレビュー(?)サイトを紹介しますので、そちらで良さそうな本にあたりをつけて、書店で実際に見ながら選ばれるとよいと思います。

参考URL:http://www.1point.jp/~book_2ch/webprog/perl.html

Q"use strict" を使っての定数宣言

"use strict" プラグマを使ったスクリプト内で、

・定数(グローバルかつ不変)
・グローバル変数

を宣言するには、どのようにすればいいのでしょうか。

windows 2000, ActivePerl 5.6.1

Aベストアンサー

確か、perl は純粋な意味での定数を定義することができなかったような。

ただ、代入できなくするだけなら、

*var = \100;

のようにすれば、エラーは出してくれます。

あと、perl は my 等で宣言しなければ、全てグローバルだったはずです。
適当に代入した変数が、関数の中で適当に使えます。

Quse と require の違いが分かりません。

use と require の違はなんでしょうか?
また、require を2度使うとエラーになってしまうのは
なぜでしょうか?
教えてください、よろしくお願いいたします。

Aベストアンサー

require はライブラリから関数をロードする実行文です。
その(requireがある)行に到達したときにロードが実行されます。

use は、どちらかというと宣言文に近い。その行に到達する
わけではなく、最初に use としたライブラリを全てロードします。

  use Module;

は、以下と全く等価です。

  BEGIN { require "Module.pm"; import Module; }


また、2度使うとエラーになる理由は、

  「require が、そのように作られているから」

です(→参照URL)。

参考URL:http://www.cec.co.jp/usr/hasegawa/Docs/perl-jman/perl-4.019/perl_137.html

Q条件分岐によってuseやrequireをする

ある条件を満たすときだけuse(あるいはrequire)をするということはどうしたらできますか。例えば、次のように、perlの版を判別してuseする/しないを分岐したいのですが、ifではできません。目的は、jperl環境で作成したプログラムを最新のperl環境に移行することです。

if ($]=~/^5\.12/){
use encoding 'cp932';
use Encode;
use subs qw(length);
sub length {
CORE::length(encode('cp932',shift));
}
   #以下色々な関数を定義する
}

Aベストアンサー

use がコンパイル時に処理するのに対して require は「そこにきたとき」に処理します. なので, require であれば普通に if で分岐できます.

use はそのまま書くと if の条件に関係なく処理するから, #1 のように eval するくらいだと思います. 十分新しい Perl なら if ってプラグマがあるんだけど, jperl にはないと思う.

ところで, この length ってあってる? なんか decode っぽい気がするんだけど.... あと, 本当ならこんな小手先の対応でお茶を濁すんじゃなくって, きちんと書き直す方がいいんだよね.

QCGI.pmを別の複数の自作モジュールでそれぞれuse。標準入力STDINのCGI.pm経由での間接的な複数回読み込みは大丈夫?

 CGI.pmを別の複数(少なくとも2つ)の自作モジュールで
それぞれのuseします。
別の複数の自作モジュールは
別のcgiファイルから一回のcgiのプロセスで
両方(あるいは全部)useします。
この場合、標準入力STDINのCGI.pm経由での
間接的な複数回読み込みは大丈夫でしょうか?

通常はSTDINは一回のcgiのプロセスで一回しか読めないはずですよね?

各モジュールから重複useしても
(もちろん複数の各モジュールで重複useしているのであり一つのモジュール内ではuse CGI;は一回のみです)
CGI.pmのほうでうまく処理して複数回読んでくれるのでしょうか?

Aベストアンサー

No1です。文意を間違えました。すみません。
package abc;
use CGI;
・・・
package def;
use CGI;
・・・
と言うことですよね?

CGI.pmのソースコードがうまく追えなかったので確実ではありませんが、一度目にnewしたCGIオブジェクトでSTDINを読んでしまうので、二度目にnewしたCGIオブジェクトではパラメータが何も読めない ということになると思われます。
モジュールの汎用性から考えても、モジュール内でCGI.pmを使うということは避け、モジュール側にメインパッケージで取得したパラメータを渡す と言う実装にしたほうがよいと思われます。


おすすめ情報