![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
こんにちは、
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の方が楽かな?と考えています。
データベースを利用できない環境の場合、どちらが良いのでしょうか?
ご意見お願いします。
No.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を使います。ソースコードを見てみれば、
とても丁寧にきちんと書かれているのが分かります。作者とはメールでしか
やり取りしたことはありませんが、とても好印象でした。
こんにちは、丁寧なご意見ありがとうございます。
>まず、dbmopenと書いてありますが、これは少し古い書き方だと思います。
そうなんですか…、ありがとうございます。調べます。
本題の、DBM::Deep ですが、
驚きました。とても簡単に使えて、しかも配列やハッシュまで保存できる。
まだ、ホンの少しのテストしかしていませんが、今回使用する環境で使ってテストしてみます。
初心者とあまり変わらないスキルの私は、CPAN の使い方とか、
モジュールのインストール方法にちょっとした不安があるんですが、(とにかく英語が…)
DBM::Deep の様に100% Perl のモジュールだと、本当にありがたいです。
Perl にはたくさんのモジュールが公開されてますが、私の様に
有効に利用できない(探す事ができない)者にとってとてもありがたい回答でした。
本当にありがとうございました。
No.1
- 回答日時:
ア.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にしようかなと考えていますが、間違っていないでしょうか?
大変恐縮ですが、お時間のあるときにご回答頂けたら助かります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ExcelをCSV書き出す場合のシー...
-
C言語でのファイルのデータ更...
-
Monster'sの改造・・・ボスモン...
-
MATLAB グローバル変数の宣言
-
VBAで巨大なファイルの途中から...
-
エクセルVBA コードが同じでも...
-
ReadLineでの読み出し行を指定する
-
openした後、closeしないでプロ...
-
VBAでCSVファイルの特定行を書...
-
ファイル内の日付から1週間前...
-
CSV出力に関して
-
awkスクリプトでダブルクォーテ...
-
バッチファイルの作り方(CSV→...
-
dos変数の%~dp0は powershellで...
-
Perl 正規表現について
-
Perlで特定文字列から特定文字...
-
エクセルVBAで素数だけを出力す...
-
FindFirstFileとFindNextFileで...
-
readdir()で得られるファイル・...
-
window.open でのファイル指定方法
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ExcelをCSV書き出す場合のシー...
-
VBAでCSVファイルを途中行まで...
-
VBAでCSVファイルの特定行を書...
-
エクセルVBA コードが同じでも...
-
VBAで巨大なファイルの途中から...
-
ReadLineでの読み出し行を指定する
-
openした後、closeしないでプロ...
-
Perlの変数に文字数制限(容量...
-
JavaでCSVファイルを高速に読む...
-
perlで、後ろの行を読んで、前...
-
perlにて2つのファイル比較
-
csvファイル改行コードの置換に...
-
Perlの質問:行と列を入れ替え...
-
VB6.0でDB接続する際に切断時の...
-
2つのCSVファイルをマッチング
-
cgiで表示するhtmlページ内でバ...
-
ADOによるCSVファイルからのデ...
-
Excelマクロでフォルダ内のCSV...
-
拡張子 ”log” と ” dat” の違い
-
perl内でPHPを動かす?
おすすめ情報