• ベストアンサー

ライブラリ化するとメモリを圧迫する?

perl で、数々の処理を一つのファイルにまとめて しまい、その都度、関数を呼び出して使う、という ライブラリ化 ( モジュール化? ) は常套手段だと 思うのですが、ひとつ気になってきました。 require "jcode.pl" ・・・みたいに、プログラムの頭の方でインクルード のようなことをします。するとそのファイルのサイズ 丸々がメモリに入るのでしょうか? つまり、ライブラリファイルが大きければ大きいほど メモリを圧迫し、処理速度に影響したり、何メガも あったりすると読みきれないとか、何かと影響は 出てこないものなのでしょうか。 いま、perl で組んでいて、一つのファイルにぜんぶ まとめてしまうのが心配になってきました。

  • yasu
  • お礼率79% (173/218)
  • Perl
  • 回答数3
  • ありがとう数4

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

  • ベストアンサー
回答No.3

実行リソースと開発環境を分けて考えてみます。 (ここではperlでCGIの開発をする場合に限定します) (1)実行リソース perlはscript実行時にcompileされます。したがってrequire,useされる ファイル量が多いほどそれに時間がかかる傾向にあります。 perl自身のload scriptのload scriptがincludeしているscriptのload compile 実行 十分なメモリがあれば、一度読み込まれたファイルはキャッシュに存在し、 メモリから即時ロードされますが、それでも1から実行を行ないます。 (よくservletと比較されるところです) scriptは同じ動作をするcompileされたbinファイルより大きくなるので、 scriptのloadには時間がかかります。また、binファイルであれば必要の ないcompileをしなければなりません。 (script言語とcompile済binと比較されるところです) library fileが大きく、そのlibraryのごく一部のmethodしか使わない のであれば損失は大きいです。 library fileが大きくとも、ほとんどのmethodを使い、それでもメモリを 圧迫し、速度が実用的でないのなら、環境を拡張するなり、別の手段を とるしかないです。 これらの改善をするために、たとえばapacheではCGIプログラムの起動の 速度向上のためのmod_perlがあります。良く使うpmを登録しとくと早い。 調べてみてください。 perlのautoloadなんかも参照。 (2)開発環境 すでに同等の処理をするpackage(class)がCPANに登録されているのにも かかわらず、私たちが同じ処理を書く必要があるのでしょうか? (私は好んで車輪を再発明する傾向にある) 機能毎に適当なファイルサイズで分割されたpackageを使いましょう。 そして、自分たちが作るpackageも機能毎に分割しましょう。 packageファイルから小分けして新しいpackageを作る(あるいは1本にする) のは得策でしょうか? たとえばpackageにバグがあり、updateされたらまた、小分けする作業をので しょうか? (1),(2)の関係で妥協点を探すしかないです。 CPU能力、メモリなどと、開発期間、メンテナンスしやすさなどを比較して。

yasu
質問者

お礼

回答ありがとうございました。 詳細にお答えいただき、大変よくわかりました。 やはり、いくつかにわけておいた方がよさそうだと 結論付けました。 package についてはイマイチよくわからないのですが 調べて参考にしたいとおもいます。

その他の回答 (2)

  • hidebu-
  • ベストアンサー率53% (45/84)
回答No.2

ちょっと正確にどういうことかわからないんですが、、、 汎用処理の関数は全部一つのクラスにまとめるってことでしょうか?? 基本的にインポート処理は実体を取り込むのではなく参照をとりこむのでファイルのサイズが丸々入るってことはないと思うのですが、、、 (でないとC++やJAVAでは大変なことになる 笑) PERLでも名前空間を利用して、C++やJAVAのようにクラスを作成できるので、ただの関数の集まりではなくきちんとクラスとして作成しておけばあとあと楽になると思います。 蛇足ですが^^;

yasu
質問者

お礼

回答ありがとうございました。 みなさまの回答を参考にさせていただき、 やはりいくつかにわけておいた方がよさそうだと 思いました。 とはいうものの、クラスについてはイマイチ よくわからないのですが、調べて参考にしたいと おもいます。

  • haporun
  • ベストアンサー率40% (230/562)
回答No.1

使わない関数が入っているのは確かに無駄ですが、同じ関数がディスクの至る所に書いてあるのも無駄です。 一度読み込まれて頻繁に使われるファイルは、たいていキャッシュされます(サーバーにもよりますが)。 そのときに、あまりにファイルが多いと、キャッシュがクリアされる確率も高いです。 ある程度用途別に分けられるのなら、その方が多少はいいと思いますが、それほど気にすることではないでしょう。 ファイルが大きすぎない、多すぎないを目安にしてみてください。

yasu
質問者

お礼

回答ありがとうございました。 ほどほど、ということですね。 やはり分散してつくってみようと思います。 参考にさせていただきました。

関連するQ&A

  • ライブラリの;#

    ライブラリを作ってをrequireして使おうと思っているのですが、 jcode.plとかは、なんでコメント行が『;#』から始まるんでしょうか? 『#』では、無いのですか?

    • ベストアンサー
    • Perl
  • No.616076に続けて質問です

    jcode.plを読み込みたく、 #!/usr/bin/perl require './jcode.pl'; としたところ、 Can't locate ./jcode.pl…というエラーが起きました。 どのような原因が考えられますでしょうか?

    • ベストアンサー
    • Perl
  • 非常に見にくいです.....

    このジャンルであっているかどうか微妙ですが質問させていただきます。 よくフリーのCGIやPHPなどのテキストファイルをダウンロードしたとき、アップロード時に転送モードが悪かったのかどうか知りませんが、よく #!/usr/bin/perl↑↑require './jcode.pl';↑require './cgi-lib.pl';↑↑..................... のように改行部がすべて↑になってますよねぇ? もし「戻りページ」など設定しなければならない部分があったりする時は非常に見にくくやりづらいのです。 そこでこの上の例を自動で #!/usr/bin/perl require './jcode.pl'; require './cgi-lib.pl'; に書き換えてくれるようなソフトがあったら教えて下さい!!

    • ベストアンサー
    • CGI
  • Jcodeモジュールの浸透具合

    CGIの勉強を始めたのですが、使っている入門書が2004年のもので、 「たいていのレンタルサーバーにはJcodeモジュールが入っていないのでjcode.plをrequireしたほうが無難」とかかれているのですが、 現在の状況はどうなのでしょうか? 個人的にはJcodeモジュールのほうが簡単なので好きなのですが、 jcode.plの勉強もしておかないと移転する際などに困りますか?

    • ベストアンサー
    • CGI
  • requireしたライブラリにuseを記入

    メール送信のプログラムを作っています。 本体のプログラムmain.cgiから、 メール送信用のサブルーチンを記入した、 email.plというのを require 'email.pl'; とメール送信が必要な場合だけ読み込んでいます。 この email.plに use Encode; や use Jcode; のようにuse文を記入するのは、 Perlの作法としては適切なのでしょうか。 それともuse文はmain.cgiに記入するのが適切なのでしょうか。 email.plにuse文を記入しても動きますし、 main.cgiにuse文を記入した場合とベンチマークを比べたりしましたが あまり変わらないのですが、 useはコンパイルしたときに実行されるので、 実行のときに読み込まれるrequireしたライブラリに記入していいのか不安なのです。 私としては必要なときだけ読み込みたいので、 email.plにuse文を記入したいのですが。 どうぞよろしくお願いします。

  • jcode.pl と &ReadParse()

    CGIファイルの先頭は #!/usr/local/bin/perl require './cgi-lib.pl'; require './jcode.pl'; &ReadParse(); という感じになっています。 ここでのの require は、日本語を使うためのもの だと思っています。合っていますか? &ReadParse() というのは何ですか? require と関係があるみたいです。 require を書かずに &ReadParse() を書くとCGIエラーになります。

    • ベストアンサー
    • CGI
  • 'cgi-lib.pl'などのファイルの位置は?

    Perlの基本的な質問ですが、cgi-lib.plやjcode.plは どのディレクトリに入れれば自然でしょうか? 私はLinuxとWindowsの両方にPerl5.6を入れておりまして、今までは相対パスによって、スクリプトの近くに置いていましたが、ディレクトリ(フォルダ)が変わるごとに設定しなおしで面倒になってきました。 WEBでもレンタルサーバーなど利用したことは無いんですが、このような基本ライブラリは、require 'cgi-lib.pl';で呼び出して?いると思いますが、 しかるべき位置にこのファイルが無いとだめだと思います。ご教授ください。

    • ベストアンサー
    • Perl
  • perlのMIMEモジュールの代用ができるスクリプトは?

    CGIでメール受信処理をするために、Net::POP3の使用はできましたが、MIME系のモジュールがサーバーに用意されていないらしく、受信したメールの解析がうまくいきません。 モジュールなので、サーバーのPERLに管理者が追加しないといけないと思うのですが、お願いしても断られてしまいました。 jcode.plやcgi-lib.plのように、requireで読み込むようなパターンにしようと思うのですが、代用できるようなスクリプトをご存知の方はいらっしゃらないでしょうか? MIME-Base64 MIME-tools MailTools IO-stringy の四点に変わるものを探しています。 よろしくお願いいたします。

    • ベストアンサー
    • CGI
  • Perlのライブラリのパスの設定方法?

    Perlで使うオリジナルライブラリとjcode.plなどの標準的なライブラリをサーバーで配置しようと考えていますが、今まではApacheのDocumentRootに置いていました。 アパッチのエイリアスやバーチャルドメインを使っていると、これらのライブラリを一元的に扱うことが出来ないので、相対パスのコピーで対処しておりました。 スマートなライブラリ管理方法はありますか? 一元化でき管理が簡単(入れ替えやライブラリのアップグレードが簡単) な方法が知りたいです。 あと、pmファイルはよく知らないのですが、このような管理方法は よい技でしょうか?

    • ベストアンサー
    • Perl
  • Can't locate jcode.pl in @INC...

    perlスクリプトをcrontabで、   0 * * * * /フルパス と起動したところ、 上記のエラーがでます。 エラー部分は、   require './jcode.pl'; です。 requireにフルパスを打ったら、直ったんですが、なぜでしょう。 Perlの設定が悪いのでしょうか?

    • ベストアンサー
    • Perl

専門家に質問してみよう