サーバのプログラムレベルでの高速化について。Perlなどから呼び出されるデータをどのように保存するか検討しています。



巨大なデータはMySQLに格納しているのですが、少量のデータを次のどの方法で格納・呼び出しするかみなさんの意見を聞かせてください。

・DBM(BerkeleyDB)
・memcached
・Storable
・IPC::SharedCache
・モジュールを動的に生成して呼び出す(*1)
・そのほか

それぞれ理由付きでお願いします。


*1
以下のようなモジュールを、プログラムで生成する。

package table;
$a = {
'key1' => 'value'
,'key2' => 'value'
};

回答の条件
  • 1人2回まで
  • 登録:2006/11/26 00:25:41
  • 終了:2006/12/03 00:30:04

回答(2件)

id:karasimiso No.1

karasimiso回答回数41ベストアンサー獲得回数12006/11/29 13:27:07

ポイント35pt

私自身、よく分かっていない(上記のモジュールをどれも使ったことない)ので、ポイントは結構です。

もしそのデータが定数で、サーバプロセスによって動的に書き換える必要のないものであるなら、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などを持ち出すよりも内部のプロセスがはるかに単純になると思います。

id:katsube

定数の場合はそうなんですよね。

use constant TRUE => 1;

use constant FALSE => 0;

とか私もやってますが、ここではそういった類の話ではなくて、例えば数万件ならSQLに対応したDBに入れるけど、十数件、数十件、数百件の場合はどうする?といった話題になります。

ちょっと説明不足でしたかね(^^;

2006/11/29 14:17:15
id:k12u No.2

k12u回答回数80ベストアンサー獲得回数72006/11/30 20:05:19

ポイント35pt

答えを出すだけの知識はないのですが,コメントできないのでヒントだけ。MySQLのHEAPテーブルはいかがでしょう。

http://dev.mysql.com/doc/refman/4.1/ja/heap.html

read/writeの比や更新衝突の耐性の要求などにヒントがあった方が答えやすいかもしれません。

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません