メンバーサイト構築にて質問です。
ユーザーから送られてきたメールのメールアドレスで、
メンバーであるか新規であるかを判断するプログラムをperlで作成したいと思っております。
まだperl初心者なのでもっと良い方法がないか考えたいのですが経験がないので考えが浅はかです。
何卒、ご意見または別の案などご教示頂けないでしょうか。
(メンバー数の想定は10万~100万 データベースは使いません)
※当初の考え
ファイルに新規ユーザーのメールアドレスを追記
→ファイルをオープンして1行づつ検索
懸念:メンバー数が多くなればファイルをオープンするだけで結構なメモリを消費するのではないか、ループで1行づつ検索したらすごい負荷がかかるのではないか。
※現時点の考え
新規ユーザーのメールアドレスをファイル名にしたファイルを作成(@マークなどは別の記号に変更)
→ファイル検査演算子でファイルがあるかどうか判断
懸念:すごく速い気がするのですが、これって現実的なんでしょうか??
No.2ベストアンサー
- 回答日時:
メールアドレスの 先頭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で書かれていてすごくとっつきやすそうで、少々気になります。
No.3
- 回答日時:
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読み込みを防げませんので 現実的ではないですね
ご回答ありがとうございます。
DBMの参考URL、早速拝見させて頂きます。
@を除くアドレスの頭4文字分のディレクトリは面白い発想ですね。
自分では思いつかない発想に関心致しました。
メンバー×ファイル+かなりの数のディレクトリ数になると言う部分は#1さんの言われている、ファイルシステムのトラブルと言うものが気にかかります。
1フォルダに多量のファイルを入れるより良い。とかあるのでしょうかね。
他の方々の参考意見も聞ければ幸いです。
No.1
- 回答日時:
動作はしますよ。
ただ現実問題、100万ファイルあるフォルダの中身を操作できるツールは存在しないでしょうね。
FTPなどで接続してもファイルリストの取得中にタイムアウトになると思います。
つまり、単純にダウンロードではバックアップするのは厳しいということです。
あと、ファイル1つ作るごとに、ファイルシステムが管理する情報が実際には発生します。権限、作成日、所有者などなど・・。
これらを100万ファイル分管理させたとなると、ファイルシステムのトラブルが発生する可能性も高まります。
ということで、「当初の考え」のほうをお勧めします。
ファイル内から該当する行を探すには、whileでテータの中身を1行ずつ読ませることでメモリの消費も一定ですみます。
この回答への補足
ご回答ありがとうございます。
バックアップに関してはssh操作にてtarボールで圧縮保存するつもりです。
ダイヤモンド演算子に対して間違えた概念を持っておりました。
おっしゃる通り whileで1行づつ処理すればメモリの問題はかなり解決しそうです。
「※現時点の考え」では、メンバーごとにデータファイルを作成し、他の処理も高速に行う予定でしたのでついでにメンバーのメールアドレス認証にファイル名を使おうと思った次第です。
10万~100万メンバーを想定した場合、ファイル1つで全メンバーのデータを入れると何もかも処理が遅くなりそうで不安です。
何か手立てがあればと思います。
また、ファイル1つでデータを管理する以外何か良い方法などありますでしょうか。
それとも10万~100万メンバー規模をファイル管理で高速化を狙うと言う事自体が非現実でしょうか。
宜しくお願い致します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・ことしの初夢、何だった?
- ・【お題】大変な警告
- ・【大喜利】【投稿~1/20】 追い込まれた犯人が咄嗟に言った一言とは?
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・【お題】逆襲の桃太郎
- ・自分独自の健康法はある?
- ・最強の防寒、あったか術を教えてください!
- ・【大喜利】【投稿~1/9】 忍者がやってるYouTubeが炎上してしまった理由
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
batファイルでrenameができませ...
-
ファイル名の文字コード(?)と...
-
FindFirstFileとFindNextFileで...
-
readdir()で得られるファイル・...
-
C言語でファイル名を取得
-
パスから最後のディレクトリだ...
-
makefileでファイルをコピー(...
-
ディレクトリツリーの表示
-
vba dir の相対パス
-
VBAでCSVファイルの特定行を書...
-
エクセルVBA コードが同じでも...
-
window.open でのファイル指定方法
-
fgets で値が取得できない
-
openした後、closeしないでプロ...
-
MATLAB グローバル変数の宣言
-
close()で例外が投げられる理由
-
VBAでCSVファイルを途中行まで...
-
ReadLineでの読み出し行を指定する
-
fopenでディレクトリ内の全ファ...
-
タブの色を変更する方法
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
batファイルでrenameができませ...
-
Windowsで複数のファイルを同じ...
-
readdir()で得られるファイル・...
-
dos変数の%~dp0は powershellで...
-
vba dir の相対パス
-
パスから最後のディレクトリだ...
-
FindFirstFileとFindNextFileで...
-
ディレクトリの判別
-
C言語でファイル名を取得
-
ディレクトリ名を取得したい
-
空白を含むディレクトリにある...
-
ファイル名と更新日付の取得に...
-
Perlで フォルダ内の全て...
-
複数ファイルの読み込みについて
-
chdirがうまくできない
-
Net::FTPを使いファイル一覧の...
-
正規表現で、特定のファイル名...
-
perl(CGI)から作成したディレク...
-
複数のCSVファイルを一つのCSV...
-
ソースの修正前後の差分が出せ...
おすすめ情報