
メンバーサイト構築にて質問です。
ユーザーから送られてきたメールのメールアドレスで、
メンバーであるか新規であるかを判断するプログラムを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で質問しましょう!
似たような質問が見つかりました
- ホームページ作成・プログラミング パスワードつきホームページ トップページ以下はどうなる 6 2022/08/16 12:04
- 法人税 電子帳簿保存法について 1 2022/04/07 11:17
- Visual Basic(VBA) batにて、異なるフォルダの同名ファイルを参照し、文字列を判別。擬似配列で変数へ格納 3 2022/04/10 03:37
- Visual Basic(VBA) 顧客ごとに違う点検案内を作成するマクロ 4 2022/09/16 05:34
- Visual Basic(VBA) 複数ファイルのデータの統合について 12 2022/05/14 12:03
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- ドライブ・ストレージ Windows10でのファイル内の文字列検索 SSDに寿命? 4 2022/07/12 03:25
- Windows 10 別ユーザーでログインした際、表示されないのソフトの探し方 1 2022/07/15 10:26
- 防犯カメラ・監視カメラ・小型カメラ VHSを高画質な動画ファイルにしたいです。 3 2022/05/06 12:08
- Excel(エクセル) エクセルのマクロについて教えてください。 1 2023/02/21 09:28
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
メールアドレスでメンバー認証
-
Perlで指定のディレクトリ以下...
-
vba dir の相対パス
-
シェルでfind結果を文字列で比...
-
csvファイルを統合する
-
Windowsで複数のファイルを同じ...
-
perl-cgi「日時によるファイル...
-
複数のCSVファイルを一つのCSV...
-
makefileでファイルをコピー(...
-
複数ファイル?処理させる方法...
-
batファイルでrenameができませ...
-
サーバー内にある指定した拡張...
-
大量メールの任意のヘッダだけ...
-
シェルスクリプトによる計算
-
文字化け
-
正規表現で " ← を削除する...
-
perlのDigest::MD5;でのMD5算出...
-
MATLAB グローバル変数の宣言
-
excel 2003から VBAのreplaceマ...
-
シェル(ksh)でテキスト文書を変換
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
batファイルでrenameができませ...
-
Windowsで複数のファイルを同じ...
-
readdir()で得られるファイル・...
-
vba dir の相対パス
-
FindFirstFileとFindNextFileで...
-
C言語でファイル名を取得
-
ディレクトリの判別
-
dos変数の%~dp0は powershellで...
-
スクロールバーを左側に、又は...
-
Net::FTPを使いファイル一覧の...
-
perlのNet::FTPで、ファイルか...
-
パスから最後のディレクトリだ...
-
コマンド「dir」の結果を、テキ...
-
テーブルの更新について
-
ファイル名と更新日付の取得に...
-
chdirがうまくできない
-
文字列$fileがファイル名として
-
Perlについて
-
フォルダの中身を知りたい
-
ディレクトリ名を取得したい
おすすめ情報