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"を開く。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2008/01/02 15:38:54
  • 終了:2008/01/07 02:30:42

回答(4件)

id:ffmpeg No.1

ffmpeg回答回数1202ベストアンサー獲得回数92008/01/02 17:06:04

ポイント20pt

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

id:kbkb

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

・file open

・Mysql

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

2008/01/02 22:26:40
id:KUROX No.2

KUROX回答回数3542ベストアンサー獲得回数1402008/01/03 00:34:47

ポイント20pt

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

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

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

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

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

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

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

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

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

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

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

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

高いと思います。

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

id:kbkb

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

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

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

2008/01/03 04:14:35
id:b-wind No.3

b-wind回答回数3344ベストアンサー獲得回数4402008/01/03 23:05:26

ポイント30pt

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

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

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

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


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

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

perlfunc - Perl 組み込み関数

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

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

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

id:kbkb

ありがとうございます。

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

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

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

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

2008/01/04 11:50:07
id:khoshi3 No.4

khoshi3回答回数71ベストアンサー獲得回数122008/01/05 07:39:27

ポイント20pt

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

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などのメール配送プログラム)などのメールキューなども上記に近い方法でファイルを保管しています。

id:kbkb

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

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

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

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

2008/01/05 16:26:26
  • id:kbkb
    スピードの差としては、perlでfile open+Read するのと、DBにconnectしてselect文をexecuteするのはどちらが速いのでしょうか?というところになります。
  • id:genkivogue
    しょーもない突っ込みですが、1ディレクトリに4万ものファイルを突っ込むと、速度が劣化しませんか?
  • id:DASM
    質問では SQL とファイルしか選択肢がありませんが、一応 Perl 備え付け/純正の DBM という方向もあります。
    - http://oshiete1.goo.ne.jp/qa2571039.html
    - http://nikkeibp.okwave.jp/qa2571039.html
  • id:kbkb
    id:genkivogueさん
    たしかに1ディレクトリには多くのファイルを詰め込んじゃいけないようですね。
    ファイル名の頭文字を利用してディレクトリを分割するようにしてみます。

    id:DASMさん
    なるほど。これも検討してみます。
  • id:khoshi3
    > こちらの一連の操作の載っているURLなど教えていただいてもよいでしょうか。
    DBI::mysql は下記の他ぐぐればたくさん例があると思います。:
     - http://www.atmarkit.co.jp/flinux/rensai/mysql04/mysql04b.html
    ちなみに、サブディレクトリでのファイル分散保存の例は、下記に例がありました。:
     - http://homepage2.nifty.com/m_kamada/cgi/counter.htm

    また、DBI::mysqlでMysqlを使うほどでもない場合は、DBD::CSVやDBD::AnyDataという手もあります。(残念ながら私は使ったことはありませんが)
     - http://homepage3.nifty.com/hippo2000/perltips/DBD/csv.htm
     - http://homepage3.nifty.com/hippo2000/perltips/DBD/AnyData.htm
     - http://www.geocities.jp/brooklet_software/db_fake/index.html
    csvファイルはExcel等で編集もできます。
    ただし、4万人規模の人事データを扱うのであれば、やっぱりDBI::mysql か少なくとも Tie::Hashで参照/編集のWebAPを書いたほうが良いと思います。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません