人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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


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

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

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


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

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

●質問者: katsube
●カテゴリ:インターネット ウェブ制作
✍キーワード:memcached MySQL Perl サーバ データ
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● karasimiso
●35ポイント

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

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

◎質問者からの返答

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

use constant TRUE => 1;

use constant FALSE => 0;

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

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


2 ● k12u
●35ポイント

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

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ