- ベストアンサー
DBMとテキストファイルのどちらが良いと思われますか?
こんにちは、 windows + ActivePerl の環境で、 簡単なデータを記録して後から検索、修正、削除したいのですが、 データを格納するのに、テキストファイルにするか、DBMを使用するか 悩んでいます。 テキストファイルに、(行番号,"*" x 100)のレコードを10万行出力したら、約10MBで、 DBMファイルに (行番号=>"*" x 100)のハッシュを出力したpagファイルは510MBでした。 その後、99999番目のレコードを以下のスクリプトで表示したところ、 体感的には違いがありませんでした。(どちらも一瞬で終了します) ******************************* #テキストファイル 検索 my $id = 99999; my $data; open(FILE,"<TEXTfile.txt") or die ; while(my $line = <FILE>){ if($line =~ /$id/){ $data = $line; last; } close FILE; print $data; ******************************* #DBMファイル 検索 my %DBM = (); my $id = 99999; my $data; dbmopen(%DBM,"DBMfile",0666) or die; if (defined $DBM{$id}){ $data = $DBM{$id}; } dbmclose %DBM; print $data; DBMを使用した場合、すべてのデータをメモリ上に展開するのでしょうか? もしそうなら、510MBも消費されてはたまりませんので、テキストファイルになりますが、 コーディング等はDBMの方が楽かな?と考えています。 データベースを利用できない環境の場合、どちらが良いのでしょうか? ご意見お願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
今晩は。 この話題では、様々な論点があるので、狭い紙面では難しいこともありますが、 幾つか書かせてもらおうと思います。 まず、dbmopenと書いてありますが、これは少し古い書き方だと思います。 最近の書籍などでは別の書き方をしていると思いますので当たってみて下さい。 次に10MBくらいでは、余り時間はかからないかもしれませんが、もう少しサイズ が大きくなるといくらか時間がかかるようになります。 テキストファイルではseek関数によってポインターを何処にでも移動できますから、 たとえば固定長のレコードの場合は、レコード長xレコード番号までseekすること によって即座に目的のレコードを読むことができます。 DBMを使うのは、キー(文字列)でダイレクトにレコードを操作できるからです。 しかし、たとえばSDBMの場合、1レコードの長さに制限があったりするので注意 が必要です。(2KBとか4KBが最大) また、普通のDBMはキーと値(=文字列)のペアでしかなく、単純なデータしか 扱うことができません。 MLDBM(Multi Level DMB)は、これを改善したものですが、やはりデータ長の制限が あります。 私がお勧めするのは、DBM::Deepです。 これは100%Perlで書かれたDBMで、Perlの配列やハッシュなどの変数を「そのまま」 保存することができ、データのサイズに制限がありません。パフォーマンスも かなり良いと思います。 少し前に調べていたことなので、 最新のバージョンは知りませんが、完成度はかなり高いと思います。 私なら、DBMの類を使うならDBM::Deepを使います。ソースコードを見てみれば、 とても丁寧にきちんと書かれているのが分かります。作者とはメールでしか やり取りしたことはありませんが、とても好印象でした。
その他の回答 (1)
- onosuke
- ベストアンサー率67% (310/456)
ア.DBMを使用した場合のメモリ使用量について Perl標準添付のSDBM実装だと、ファイルデータの保持目的では、ブロックバッファ分のメモリ(数kバイト)しか消費しません。 >99999番目のレコードを以下のスクリプトで表示したところ このテストでは、人間の時間感覚で計時する限り、有意な差は得られないでしょうね。(CPUクロック数の単位精度でやらないと…) また、OSのバッファメモリに必要なデータが全て収まっていて、テキストとDBMのファイルサイズ差も問題にならないでしょう。 イ.データベースを利用できない環境の場合、どちらが良いのか? 「DBMもデータベースですが…」というツッコミはさておき、 サイジングを気にするのであれば、もっと他のDBM系実装についても比較検討すべきです。 参考URLにQDBMのページを掲示します。 「兄弟」というセクションに他のDBM系実装と、ベンチマーク結果が掲載されています。
- 参考URL:
- http://qdbm.sourceforge.net/
補足
早速ご意見ありがとうございます。 >「DBMもデータベースですが…」というツッコミはさておき、 すみません、MySQLとかPostgreSQLとかのつもりでした、RDBMSと書けばよかったのかな?と反省しています。 QDBM 見てみました、ベンチマークの結果は速そうですし、オブジェクト指向な書き方で使えるようなので、 とてもよさそうですね。 でも、ちょっと見た感じでは、windowsの場合はCygwinを使わないとならない感じですかね? もしそうなら、今回は見送りになりそうですが、もう少し詳しく読んでみます。 オライリーの ”初めてのPerl” をざっと読んだ程度のスキルしか持ち合わせていないので、 Perl標準のDBM以外にもいろいろな方法が在ると知りませんでした。とても勉強になります。 >Perl標準添付のSDBM実装だと、ファイルデータの保持目的では、ブロックバッファ分のメモリ(数kバイト)しか消費しません。 >このテストでは、人間の時間感覚で計時する限り、有意な差は得られないでしょうね。 少し安心しました。 つまり、ディスクの容量に制限がなく、前記のデータの量程度ならば、どちらを使ってもほとんど差が無いと考えて、 ランダムアクセスが使えるDBMにしようかなと考えていますが、間違っていないでしょうか? 大変恐縮ですが、お時間のあるときにご回答頂けたら助かります。
お礼
こんにちは、丁寧なご意見ありがとうございます。 >まず、dbmopenと書いてありますが、これは少し古い書き方だと思います。 そうなんですか…、ありがとうございます。調べます。 本題の、DBM::Deep ですが、 驚きました。とても簡単に使えて、しかも配列やハッシュまで保存できる。 まだ、ホンの少しのテストしかしていませんが、今回使用する環境で使ってテストしてみます。 初心者とあまり変わらないスキルの私は、CPAN の使い方とか、 モジュールのインストール方法にちょっとした不安があるんですが、(とにかく英語が…) DBM::Deep の様に100% Perl のモジュールだと、本当にありがたいです。 Perl にはたくさんのモジュールが公開されてますが、私の様に 有効に利用できない(探す事ができない)者にとってとてもありがたい回答でした。 本当にありがとうございました。