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

perlでMysqlと通常のfileをopenするのは以下ケースではどちらが速いのでしょうか。
実効スピードはやってみないとわからないので、論理的にこういう動作があるから速い、という回答をお願いします。

前提:
・社員4万人の社員番号、名前、住所、氏名その他20項目を社員番号をキーに取り出す
・抽出はview.cgi?id=0012 と、CGIの引数idのvalueをそのまま社員番号としてDBにアクセスして取り出す
・取り出したデータ20項目は特に加工せずにHTMLとして出力

操作1
Mysqlでstaffdataテーブルを作成し、20項目をフィールド、社員番号を主キーとしてinsert
CGIからのアクセス時にはDBIでselect * from staffdata where id = '$id' として抽出。

操作2
サーバー上に20項目をタブ区切りにし、$id.datとidごとに保存。
idのデータは4万ファイルでき、/staffdata/ディレクトリ下に保存。
例:0012.dat
0012\t山田太郎\t東京都港区\t0311111111\t・・・
CGIアクセス時は "./staffdata/$id".".dat"を開く。


●質問者: kbkb
●カテゴリ:インターネット ウェブ制作
✍キーワード:CGI dat dB DBI HTML
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● ffmpeg
●20ポイント

一般には速さではperlだと思います。http://www

◎質問者からの返答

すいません、perlというのは

・file open

・Mysql

のどちらのことでしょうか。


2 ● KUROX
●20ポイント

ファイルIOのファイル名サーチより、DBのINDEXのサーチのほうが早そうだから。

-----------------

実際は分かりませんが、DBを使うほうが現状では主流であるし、

DBはコネクションプールとかも使えまますので、そんなに遅いとも思えません。

多重アクセスがあった場合も、DBの方が有利だと思います。

-------------------

http://japan.cnet.com/blog/neta/2006/08/20/linux1153000_b892/

1ディレクトリ下に大量のファイルを作るのは好ましくないと思います。

たぶん、遅くなると思います。

-------------------

DBの方は、内部でINDEXファイルのようなものが生成されると思いますし、

頻繁に使うのなら、この部分はメモリー上にキャッシュされてる可能性が

高いと思います。

-------------------

◎質問者からの返答

丁寧な回答ありがとうございます。

なるほど、ディレクトリに大量のファイルを置くと遅くなるんですね。FTPでアクセスした時は開くまでにかなり時間がかかりますが、CGIからファイルに直アクセスするとそうでもなかったので気づきませんでした。

多重アクセスも想定していますので、DBにしたいと思います。


3 ● b-wind
●30ポイント

読み書きともファイルのほうが圧倒的に早い。

DBで管理するとどうしてもオーバーヘッドがかかるし、実経験上もそれを裏付けるデータがある。

ただし、あまり1ディレクトリに大量のファイルが存在すると遅くなるので適度にサブディレクトリに分ける必要はあるだろう。

ただ、これはファイルシステムにも寄る。RaizerFS あたりだとそんなに遅くならない。


とはいっても、あくまで単純なアクセスの比較だけでは良し悪しは決定できない。

更新が同時に発生する場合 flock 等で同期を取る必要があるが、ファイルベースでは処理が面倒だしファイルシステムによっては同期が保障されない。

perlfunc - Perl 組み込み関数

また、主キー以外での検索が絶望的に遅くなる(全ファイルを検索するしかない)。

RDBMS をはじめとするDBを使う最大の利点はこのあたりの処理をシステムに任せてしまえるところにある。

ACID 特性や柔軟な検索が必要ならDBMSを、それが要らず主キーのみの検索だけですむならファイルベースで問題ないでしょう。

◎質問者からの返答

ありがとうございます。

> 更新が同時に発生する場合 flock 等で同期を取る必要があるが、ファイルベースでは処理が面倒だしファイルシステムによっては同期が保障されない。

今回はWriteは発生せず、Readのみで考えています。Writeが頻繁に発生する場合はDB優先ですね。

> また、主キー以外での検索が絶望的に遅くなる(全ファイルを検索するしかない)。

ファイルシステムでの主キーとは、今回でいうファイル名のことでしょうか。


4 ● khoshi3
●20ポイント

大体の結論は出ておられるようですのでちょっと補足をさせて頂きます。

DBI::mysqlを使いこなせそうなら、mysqlのほうが断然お勧めです。

http://www.7key.jp/software/mysql_perl2.html]

2番目のお勧めは、perlのhash(Tie::Hash)でファイルにDBを持ったほうが速くて扱いやすいです。(DASMさんも指摘されてますが)

社員データを更新したいときは別プログラムのTie::Hash経由でファイルに書き込み更新できます。

http://fleur.hio.jp/perldoc/mix/lib/Tie/Hash.html]

ただし、本当にReadのみのシステムで主キーのみでの検索をテキストファイルで扱いたい場合は

同一ディレクトリに万単位の大量のファイルを置くと確かにアクセスが遅くなりますので、

適当なハッシュ値でサブディレクトリに分散させる手法がお勧めです。

主キーが社員番号なら、下1桁か2桁のサブディレクトリ配下に「社員番号.dat」を置きます。例えば、

00012 -> "./staffdata/12/00012.dat"

03456 -> "./staffdata/56/00056.dat" みたいな感じです。

(ちなみにファイル名の頭文字(上1桁など)だときれいに分散せず偏ってしまうのでダメです)

MTA(postfixやqmailなどのメール配送プログラム)などのメールキューなども上記に近い方法でファイルを保管しています。

◎質問者からの返答

まとめていただきありがとうございます。

DBI::mysqlは勉強中ですが、最低限は使える状況ですので、今回はこちらを採用したいと思います。

ディレクトリを下1桁?下2桁で分散させる事は、ログファイルの保存などでは非常に大切そうですね。

もしよろしければこちらの一連の操作の載っているURLなど教えていただいてもよいでしょうか。

関連質問


●質問をもっと探す●



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