• ベストアンサー

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

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

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

  • ベストアンサー
回答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
質問者

お礼

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