見学に行くとしたら【天国】と【地獄】どっち?

メンバーサイト構築にて質問です。

ユーザーから送られてきたメールのメールアドレスで、
メンバーであるか新規であるかを判断するプログラムをperlで作成したいと思っております。
まだperl初心者なのでもっと良い方法がないか考えたいのですが経験がないので考えが浅はかです。
何卒、ご意見または別の案などご教示頂けないでしょうか。

(メンバー数の想定は10万~100万 データベースは使いません)

※当初の考え
ファイルに新規ユーザーのメールアドレスを追記
→ファイルをオープンして1行づつ検索

懸念:メンバー数が多くなればファイルをオープンするだけで結構なメモリを消費するのではないか、ループで1行づつ検索したらすごい負荷がかかるのではないか。


※現時点の考え
新規ユーザーのメールアドレスをファイル名にしたファイルを作成(@マークなどは別の記号に変更)
→ファイル検査演算子でファイルがあるかどうか判断

懸念:すごく速い気がするのですが、これって現実的なんでしょうか??

A 回答 (3件)

メールアドレスの 先頭1文字ごとに 別のFileを作って保存したらどうでしょう?


abc@hoge.example.com 、 a@test.example.jp 、 aki@example.tv =>file名「a]に書き出し
boku@***.net    省略    =>file名「b」に書き出し 

メールアドレスの先頭に数字を使えるところと使えないところ
大文字もありのところと小文字だけのところなど様々ですが
多くてもfile数は数十個ですし
検索時の負担も数十分の一にはなるんじゃないでしょうか?

この回答への補足

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

良い手法ですね。

mailaddres | No | flag |\n
を1行として10万行。「10万メンバー分のデータを1ファイルで保存」と仮定して実験してみました。

whileで検索をかけ99999行目でマッチさせるのに、0.15秒でした。サーバー環境もあるでしょうけどかなり速いものですね。

ファイルで管理する場合はこのabcファイルインデックス手法?が最善でしょうか。

この度の主旨から少し離れますが、調べておりましたらDBMという物を知りました。
DBM::Deep(DBMとは別物?)などはPerlで書かれていてすごくとっつきやすそうで、少々気になります。

補足日時:2008/06/27 00:23
    • good
    • 0

DBMとかはつかったこと無いので、、


普通にcsvfileに書き込み/読み出しすれば足りていましたし
CSVの方が他にも使い回しが出来るので、、、

DBMについては
http://www.lr.pi.titech.ac.jp/~abekawa/perl/perl …
http://memo.blogdns.net/cgidbm.html
あたりを見ていただくか 詳しい人に追加回答いただけると嬉しいです

さてと、以下 思いつきで書きますので 適当に取捨選択してください
#2の応用ですが インターネット上のメールアドレスだと
最低でも 4つ以上の 半角英数字を含むと思います(<=a@*.jp  LAN内だと a@aも有るが)
それを利用してサブディレクトリを生成すれば
>メールアドレスをファイル名にしたファイルを作成
も現実的に成りますね

$mail に 入力された アドレスがあるとして TESTするなら
$mail = 'a@example.com';# ←TEST用アドレス
@list_p = ($mail =~/\w/g);
#↑ @list_p の各要素に 半角英数字または _ が一つづつ格納される(以前の質問での他の回答者の受け売りですが )
print join(" - ",@list_p); # ← 確認のため表示してみる
# 上の例だと a - e - x - a - m 以下略 と表示される

取得した値のうち $list_p[0] ~$list_p[3] まででディレクトリの階層とします
データ用の親ディレクトリを /home/tarou/list/ (以下では list/)として 上のサンプルアドレスだと
list/a/e/x/a/ と言う階層に a@example.com と言うfileをおきます。

既に数十件のアドレスが登録されている状況を考えると
1.入力されたアドレスから list/a/e/x/a/ と言うディレクトリのパスを取得
2. fileTEST演算子で ディレクトリが存在するか確認
   =>アドレス自体を確認するまでも無く 新規だと言う事が判る
3.list/a/e/x/a/a@example.com が有るか fileTEST演算子で確認

尚 個人情報保護の観点から list/ 以下のフォルダに 他人がアクセスできない工夫が必要です
suexec でCGIが動くなら ディレクトリのパーミッションを 700 にすれば 大丈夫だと思いますが

suexecでないなら共用サーバーではhttpアクセスは防げますが
他のユーザーが設置した CGIによるfile読み込みを防げませんので 現実的ではないですね
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
DBMの参考URL、早速拝見させて頂きます。

@を除くアドレスの頭4文字分のディレクトリは面白い発想ですね。
自分では思いつかない発想に関心致しました。

メンバー×ファイル+かなりの数のディレクトリ数になると言う部分は#1さんの言われている、ファイルシステムのトラブルと言うものが気にかかります。
1フォルダに多量のファイルを入れるより良い。とかあるのでしょうかね。

他の方々の参考意見も聞ければ幸いです。

お礼日時:2008/06/27 20:56

動作はしますよ。



ただ現実問題、100万ファイルあるフォルダの中身を操作できるツールは存在しないでしょうね。

FTPなどで接続してもファイルリストの取得中にタイムアウトになると思います。

つまり、単純にダウンロードではバックアップするのは厳しいということです。

あと、ファイル1つ作るごとに、ファイルシステムが管理する情報が実際には発生します。権限、作成日、所有者などなど・・。
これらを100万ファイル分管理させたとなると、ファイルシステムのトラブルが発生する可能性も高まります。

ということで、「当初の考え」のほうをお勧めします。
ファイル内から該当する行を探すには、whileでテータの中身を1行ずつ読ませることでメモリの消費も一定ですみます。

この回答への補足

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

バックアップに関してはssh操作にてtarボールで圧縮保存するつもりです。

ダイヤモンド演算子に対して間違えた概念を持っておりました。
おっしゃる通り whileで1行づつ処理すればメモリの問題はかなり解決しそうです。

「※現時点の考え」では、メンバーごとにデータファイルを作成し、他の処理も高速に行う予定でしたのでついでにメンバーのメールアドレス認証にファイル名を使おうと思った次第です。

10万~100万メンバーを想定した場合、ファイル1つで全メンバーのデータを入れると何もかも処理が遅くなりそうで不安です。
何か手立てがあればと思います。
また、ファイル1つでデータを管理する以外何か良い方法などありますでしょうか。

それとも10万~100万メンバー規模をファイル管理で高速化を狙うと言う事自体が非現実でしょうか。
宜しくお願い致します。

補足日時:2008/06/26 15:06
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報