![](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で質問しましょう!
似たような質問が見つかりました
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- Visual Basic(VBA) ExcelからAccessのテーブルに書き込む時に時間がかかる 1 2022/10/14 20:38
- その他(プログラミング・Web制作) pythonのこのエラーがわかりません 3 2022/11/16 14:54
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- Visual Basic(VBA) vbaのループ処理について 6 2022/05/06 15:35
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- Perl perl このテキストファイルを簡単に配列に入れるには? 2 2022/04/27 20:24
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/21 09:42
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAで巨大なファイルの途中から...
-
VBAでCSVファイルの特定行を書...
-
VBAでCSVファイルを途中行まで...
-
cgiで表示するhtmlページ内でバ...
-
エクセルVBA コードが同じでも...
-
CSVが可変長の場合の検索方法
-
perlで、後ろの行を読んで、前...
-
Perlの変数に文字数制限(容量...
-
openした後、closeしないでプロ...
-
ExcelをCSV書き出す場合のシー...
-
ファイルのアップロード方法(Perl)
-
awkスクリプトでダブルクォーテ...
-
ファイル名を複数個配列で確保...
-
batファイルでrenameができませ...
-
Windowsで複数のファイルを同じ...
-
AutoNts
-
ファイルを分割する。
-
LISPによる横型探索
-
perlでcsvファイルを読む(ダブ...
-
全角と半角文字が混在している...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAでCSVファイルを途中行まで...
-
VBAで巨大なファイルの途中から...
-
ExcelをCSV書き出す場合のシー...
-
VBAでCSVファイルの特定行を書...
-
openした後、closeしないでプロ...
-
ReadLineでの読み出し行を指定する
-
エクセルVBA コードが同じでも...
-
csvファイル改行コードの置換に...
-
Perlの変数に文字数制限(容量...
-
perlにて2つのファイル比較
-
C言語でのファイルのデータ更...
-
JavaでCSVファイルを高速に読む...
-
VB6.0でDB接続する際に切断時の...
-
MATLAB グローバル変数の宣言
-
alarmのタイムアウト後の処理で...
-
DBMとテキストファイルのどちら...
-
perlで、後ろの行を読んで、前...
-
拡張子 ”log” と ” dat” の違い
-
5行おきに5行ずつ抽出するに...
-
テキストデータから指定した1...
おすすめ情報