巨大なデータはMySQLに格納しているのですが、少量のデータを次のどの方法で格納・呼び出しするかみなさんの意見を聞かせてください。
・DBM(BerkeleyDB)
・memcached
・Storable
・IPC::SharedCache
・モジュールを動的に生成して呼び出す(*1)
・そのほか
それぞれ理由付きでお願いします。
*1
以下のようなモジュールを、プログラムで生成する。
package table;
$a = {
'key1' => 'value'
,'key2' => 'value'
};
私自身、よく分かっていない(上記のモジュールをどれも使ったことない)ので、ポイントは結構です。
もしそのデータが定数で、サーバプロセスによって動的に書き換える必要のないものであるなら、use constantや定数関数( sub XXX() {'Hello World'} を使います。man perlsub では定数関数ならperlの実装によってはインライン展開が期待できるというような文面があったと思います。実験はしていませんが。
Constant Functions
Functions with a prototype of "()" are potential candidates for inlin-
ing. If the result after optimization and constant folding is either a
constant or a lexically-scoped scalar which has no other references,
then it will be used in place of function calls made without "&".
Calls made using "&" are never inlined. (See constant.pm for an easy
way to declare most constants.)
( 引用元: man perlsub, 'Constant Functions' )
アクセスカウンタのように頻繁に他数のプロセスが参照、書き換えを行うタイプのデータについては、上記のどれも使った事がないのでコメントできません。
もし本当に小量なら(1個か2個)なら、ファイルに直接書き込んでもよいと思います。(ファイル名が"key"で、ファイルの中身が"value"に相当するイメージで。)もちろんflock等による排他制御が別途必要になりますが、わざわざDBMなどを持ち出すよりも内部のプロセスがはるかに単純になると思います。
答えを出すだけの知識はないのですが,コメントできないのでヒントだけ。MySQLのHEAPテーブルはいかがでしょう。
http://dev.mysql.com/doc/refman/4.1/ja/heap.html
read/writeの比や更新衝突の耐性の要求などにヒントがあった方が答えやすいかもしれません。
定数の場合はそうなんですよね。
use constant TRUE => 1;
use constant FALSE => 0;
とか私もやってますが、ここではそういった類の話ではなくて、例えば数万件ならSQLに対応したDBに入れるけど、十数件、数十件、数百件の場合はどうする?といった話題になります。
ちょっと説明不足でしたかね(^^;