UNIX DBMはこちら(GNU gdbm, Berkeley DB etc...)
リレーショナルじゃなくてもSQLでなくてもデータベース。
C/C++, perl, python, tcl/tk, java etc言語バインディングも
豊富だしお前ら、もっと活用してみませんか?
Berkeley DB
http://www.sleepycat.com/
GNU dbm
http://www.gnu.org/software/gdbm/gdbm.html マルチスレッドなプログラムでndbmを使用しようとしたんですが、
やはっりというかMT-unsafeなんですよね。
バークレーDBや、qdbm,cdbmはMT-safeなのか、ご存知の方教えて
頂けませんでしょうか
因みにOSはsolaris8で、プログラムの中では検索しかしません。
(検索だけなのでndbmでもいけそうな気もするのですが、、、)
dbm_fetchを呼ぶと、以前呼んだ時の戻り値のdatum.dptrが指す先が書き換えられるんだね。
これのせいで昨日からずっと悩む羽目にあった。 berkeley db java editionってどう? すいません、純粋にjavaだけで動かすことができるDBMっていうのは
あるのでしょうか? Berkeley DB はJava editonがあるのがわかりました。
ちなみに、話題のqdbmっていうのは、java向けのAPIがあるだけで、
javaだけでは動かないのでしょうか? 最近話題になったとこだと
ttp://slashdot.jp/article.pl?sid=04/08/04/0843246
あたりか? Berkeley DB のライセンスって、なんかBSDライセンスとかじゃ
無いみたいんだけど、日本語でライセンスの書いてある説明
とかってないでしょうか? Berkeley DBの使い方が分かるWeb上のドキュメントがあればURLを教えてください。
db_loadというユーティリティでデータベースファイルを作成することはできたのですが、
いらなくなったkey=dataペア(レコード)を削除する方法が分かりません。
そのつど.dbファイルを作り直さなければいけないのでしょうか。 高林さんの馬DBネタとか。
ttp://namazu.org/~satoru/diary/200406.html
ttp://namazu.org/~satoru/diary/200407.html
>>123はNent Yaku >>121
C言語なら
int DB->remove(DB *db, const char *file, const char *database, u_int32_t flags);
という関数がある。C++でもJavaでも同様のメソッドがある。 http://namazu.org/~satoru/diary/200406.html
http://namazu.org/~satoru/diary/200407.html >>122-123
レスありがとうございます。121です。
付属のユーティリティをつかって簡単に削除できるのだろうとおもっていたのですが
そういう使い方をするモノではないんですね。ちょっと勘違いしておりました。 qdbmっていいの?そんなにいいの?
使うよ?いいの? cygwin + ruby1.8 + BerkeleyDBでうまくいってる人いる? おいおい、会社でだめぽだったのに家では余裕でできた。
会社のはbdbがdevel版がインストールされてなかったのかな。 perlでNDBMを使ってたんですけど1日で10倍以上にサイズが肥大化したので
Berkeley DBに変更しました。すると肥大化はしなくなったものの負荷が数倍かかるようになりました。
GDBMなんかは肥大化するわ壊れるわで最悪でした。
perlのバージョンを変えてもapacheのバージョンを変えても解決せず。
アクセスが多すぎると駄目なのでしょうか。 >>131
ちゃんとファイルロックしてないだろ。壊れるのあたりまえ。
NDBMにしろGDBMにしろ最初はファイルサイズ大きくなる。
が、後からはデータを追加してもその分しか大きくならない。 flockでファイルロックは行っています。
壊れるというのは、ファイルが飛んでサイズが減るわけではなく
サイズはそのままで全てのデータが読み込み出来なくなります。
ぷららのサーバで同じように試してみるとどんどんファイルサイズに差が出てきます。
直ぐに200KBと5MBくらいに差がでました。
1度テキストに変換して全て書き直すとサイズは200KBまで落ちたので異常に肥大化されているような気がします。
QDBMはインストールはしましたが書き込めても読み込めなく、原因が分からなかったので諦めました。
許容できないなら仕方ないが、サイズの肥大化は
索引や効率を考えて前もって領域を確保してる分だから、
動作としてはおかしくない。
あと実装によってはdbm側でロックの機構があるから、
それを使う方が望ましいかもしれない。 >>131
GDBMが壊れるあたり、DBとの接続をちゃんと切ってないことない?
CGIとかでも、プロセスが死ぬ前に確実に接続を切る(ハンドルを閉じる)
ようにしないとファイルがおかしくなるよ。 SymbianOSに入るようなメモリ空間100KB以下の
DBご存知ないですか?C言語でお願いしまっする。 >138
そんなん(メモリ空間100KB以下)だったらDBいらねーんでは? >>138
QDBMは? POSIX互換なら動きそうだけど。 solidはどう?商用だけど。
ノキアやOpenViewで使ってるって。 超遅レス
>>134
bdb使っているのにflockでロックってなんの冗談なんだろう?
ttp://pybsddb.sourceforge.net/ref/lock/stdmode.html BerkeleyDBよく見たらすごいな。
トランザクション使えるし、レプリケーションできるし、
オンラインバックアップできるし、2phase commitできるし。
ただ、ライセンスがきつくて使いづらい。
BerkeleyDBの料金体系ってどんな感じなんでしょう。
どなたか具体的なお話を聞かせて頂けないでしょうか? Sleepycatにサポートしてほしいってこと?
直接聞けばいいのに。 >>148
公表されても構わないことと思われるのに、
ネットで全然その話題に行き着かなかったのです。
BerkeleyDBの利用しづらさって、その辺が全然分からんのもあると思うので、
どなたか情報を放流してもらえないかと期待しての書き込みです。
>>150
いや、そこに載ってるのはサポートの価格で
知りたいのはコマーシャルライセンス自体の価格だと思われ。
Sleepycatのオープンソースライセンスは実質GPL(否LGPL)と同等だから、
製品に組み込もうと思ったら、その製品のソースも何らかの形でオープンにしないと駄目。
http://www.opensource.jp/licenses/sleepycat.html
多分InnoDBと同程度の価格だと思うんだけど、InnoDBはOEMオンリーで
結局MySQLでの価格差でしか見れないし、本当の供給してる値段は判らんね。
QDBMのVillaで、重複レコードは同じキーのレコードの末尾に格納されるとあるけど
これはキーが重複したレコードの中では登録日時順に並ぶという事だよね。
しかし分からないのはその後の「DBのアップデートの為にそのカーソルは使えなくなる」という記述。
どういう事?
マニュアルのサンプルコードで重複キーのレコードに対してカーソルを使っているが。 QDBMのVillaの比較関数ってどこに書いてどう使えば良いの?
とりあえずVLCFUNC型の変数に自作関数のポインタを入れてみたけど
それで自動的に使われるというわけではないみたいだし。 おー、分かった。
すっげ嬉しい。
openするメソッドの引数で指定するんじゃん。
灯台下暗しだな。
俺は下以外も暗いけどな。 qdbmのodeumはWEB上の文書しか扱えないの?
アプリケーション内で作った文字列を格納する方法が見当たらないんだが。 個々の文書はwebとは限らないけれど、もとの文書を格納しておくわけじゃな
くて、転置インデックスしか管理しない。
estraierの用途を考えればわかるように、元の文書はどっか他の場所にファイ
ルとしてあるっていう前提があって、 odeum 側で、いちいちそのファイルの
内容をコピーせずに、そこへの参照(パスとか)だけ持てばいいって発想なんだ
ろう。
APIなんだから、対象の文書がどこに保存してあるとか関係ないでしょ。
ODDOCオブジェクトを作ってoddocaddwordで語を入れさえすればいい。 pure java のDBMっぽい。おまえらコントリすれ
http://jdbm.sourceforge.net/ >>161
BSD License だったから あげさせてもらうよ oddocopen("URI")は、実際にそのURIにアクセスしてデータを取得したりしないの? >>157
しないよ。文書にIDをつけてるだけみたい。実際にはユニークであれば
どんあ文字列をしていしてもいいみたい。 QDBMのC用APIにはvistaがあるけどC++用APIには無いのは何故? QDBMのODDOC型にunsigned intのポインタを加えようとして、
ODDOC構造体にunsigned int *num;を書き加えて、
アプリケーション側でODDOC->num = unsigned intのポインタ;
と書いたのだけど、
odput内でODDOC->numを書くとセグメンテーション違反になってしまう。
oddocopen();を、unsigned int *numを引数として受け取る様にして、この関数内でODDOC->num = num;
とする方法も試してみたけど、そうするとポインタの代入が上手く行かない。
oddoc *doc;
unsigned int num[10];
cout << num << endl;
doc = oddocopen(URI,num);
cout << doc->num << endl;
で、numとdoc->numの値が異なってしまう。
原因分かる方居たら教えてくれませんか? >>167
reboot後にコンパイルしても変わらないし、make uninstall して make installしても変わらないし、
変更が一部反映されてるからそれは大丈夫だと思うんだけど。
話は変わるけど、
c++でvistaを使いたくて、
アプリケーションのソースコードに#include<vista.h>を書いてみたり、
xvilla.hやxvilla.ccのvilla.hの部分をvista.hに変えて見たりしたけど
そのアプリケーションを実行してもディレクトリじゃなくvilla用のファイルが生成されてしまう。
qdbmのメーリングリストに参加しようとしても何故かメールが送信出来ないし。
qdbmのマニュアルのサンプルコードをvilla.hからvista.hに変えて使ってみると
ちゃんとディレクトリ生成してvistaとして動くんだけど。
xvista.hというファイルは無いし。
C++ではvistaは使えない仕様なのかな? インストール時に発生していた問題に応急処置をしていた事が原因でした_no バークレーDBをperlで使っていますがファイルロックがよくわかりません。
>>142氏のリンク先を何度読んでも理解できず…
どなたか簡単に解説をお願いできないでしょうか。 すんまそん…、普通にperldocに日本語で書いてありました。
お時間の許す方は煽ってやってください orz >これを性能指標とするならば、例えば100万個のレコードを格納するためには50万要素のバケット配列が求められる。
>バケット配列の各要素は4バイトである。
>すなわち、2MバイトのRAMが利用できれば100万レコードのデータベースが構築できる。
QDBMのマニュアルから引用。
これって、バケット配列は2Mしか使わなくてもハッシュが重複してるレコードが50万あるからその為にメモリ使って
2Mバイトじゃ済まないよね?
重複レコードをどう扱ってるのか知らないけど、ポインタとprimary keyが要るから
バケット配列と合わせて合計6Mは使いそうな気がするんですが。 > ハッシュ値の衝突はセパレートチェーン法で管理する。チェーンのデータ構造は二分探索木である。
という記述と、
> レコード部はバケット部の直後からファイルの末尾までを占め、各レコードの以下の情報を持つ要素が記録される。
> 1. フラグ : `int' 型の整数である。
> 2. キーの第二ハッシュ値 : `int' 型の整数である。
> 3. キーのサイズ : `int' 型の整数である。
> 4. 値のサイズ : `int' 型の整数である。
> 5. パディングのサイズ : `int' 型の整数である。
> 6. 左の子の位置 : `int' 型の整数である。
> 7. 右の子の位置 : `int' 型の整数である。
> 8. キーの実データ : キーのサイズで定義される長さを持つ一連のバイトである。
> 9. 値の実データ : 値のサイズで定義される長さを持つ一連のバイトである。
> 10. パディング : 値のサイズとアラインメントにより算出される長さを持つ一連のバイトである。
という記述から判断するに、重複レコードのポインタはファイル内に記録してあるっぽい
データベースそんなに更新しないならcdb最強でFA? そろそろdbopenします。
やっぱりver1が落ち着く。 Berkeley DBとBSDは全く関係ねーだろ。 Berkeley DB メールで値段聞いても無視だったよ なんなんだろうwww ボラクルに買収されたから使うのやめよ。。
ボラクル調子こきすぎてなんかむかついてきたぞ。。
BDBオープンソースじゃなくなる日も近いのかな。。 その時はGPL化されてFedora DBになりますからご心配無く。 FSFにはgdbmがあるからBDBを買い取る理由がない。
Red Hatは自社のLinuxのパッケージデータベースにBDBを使ってる。
おそらくBDBユーザ数としては最大。 QDBMがACIDサポートすればBDB要らなくなるかも オラクルは InnoDB も買収したが、MySQL の買収には失敗したようだな。 Berkeley DBでデジカメの画像をデータとして入れる時はどうしたらいいの?
教えて下さい。
いや、普通に入れれば入ると思うんだけど。
もうちょっと具体的にどんな言語を使うとかどういう使い方をするとか詳しく。 >>194
有り難うございます。
いくつか見たサンプルが、いずれもテキスト形式のデータだったので、
バイナリデータは何等かのかたちでエンコードする必要が有るのかなと
思い、確認をしないまま質問してしまいました。
FreeBSD 6.1Rでgccを使っています。
今は郵政公社の郵便番号データをサンプルデータとして、Cで簡単な
プログラムを書きながら使い方を覚えようとしている途中なので、
具体的にこういう使い方をしたいと言えるレベルに達していません。
一応、画像データ、撮影時の情報、データ加工の内容等を
リンクさせて見たいなと思っています。
画像データは結構サイズが大きいのですが(RAWデータだと数十M位)
データの取り扱いで何か注意しなければいけない事など有りますか?
もしよろしければ注意点などお願いします。
画像ファイルはどこかのディレクトリに置いといて、
パスだけDBに入れるってのもアリかもよ。
取り回しが面倒になる欠点はあるが、万一DBが壊れた場合の
復旧とか考えるとそっちの方が安心。
>>196
先ずはパスを管理するデータベースを作ってみようと思います。
色々質問をしてすみませんでした。
画像データのサイズは数メガの間違いです。 3年掛かりでやっと200レスか。まったりしててよきかな。 とっつきにくいからねえ。使ってる香具師も皆無だし、マヌアル本も皆無。 >>202
漏れのことを忘れないでくり。
職場のweb上の会議室予約のデータベースに使ってる。
速い、手軽、イイー。 >>204
相談に乗りますよ。検索→読みモジュールと書き込みモジュールとあるが
それぞれ20万でどうよ。 perl cgiで二十万はボッタクリだな。
ハロワに月収18万で募集掛けたほうが安く上がる。 >>206
その通り。モジュール類だけ挙げるとこんなんだす。
#!/usr/bin/perl
use Fcntl;
use SDBM_File;
use Time::Local;
require "cgi-lib.pl";
require "jcode.pl";
&ReadParse;
>>207
吹っかけただけだす。そらあんた、5〜6マソで十分よ。