【Perl】掲示板を使ろう! (504レス)
上下前次1-新
68(1): 名無しさん@お腹いっぱい。 [ ] 2001/07/08(日)17:52 ID:??? AAS
初歩的な質問ですみませんが、
データファイルって、読み込みの時にもロックした方がいいですか?
それから、レスを多次元配列に入れてから書き出したいのですが、
配列全体のサイズが100KBとかになっても問題ないですか
69(3): 名無しさん@お腹いっぱい。 2001/07/09(月)00:38 ID:vYQpj6T6(1) AAS
>>68
おれはflockが使えるときは読み込みのときでも
flock(FILE, LOCK_SH) ってやってるよ。
ただしsymlinkを使ったりする場合は読み込みではロックしない。
配列サイズは、サーバのメモリ容量とアクセス頻度を考慮して
判断すべきだから一概にいえないけど、
うちの環境では100KBならまず気にしない。1MBだと気にするかも。
70(1): 名無しさん@お腹いっぱい。 2001/07/09(月)10:12 ID:8Wkoq3g6(1) AAS
>69
気にしてください、お願いします
71: 名無しさん@お腹いっぱい。 2001/07/09(月)10:21 ID:??? AAS
専用鯖なんじゃないの?
共用鯖だったら締め頃したくなるところだが
72: 名無しさん@お腹いっぱい。 [ ] 2001/07/09(月)10:34 ID:??? AAS
>>70
そっか、そうすると
たとえばデータファイルで100行分、まあ、レス100を表示するとすると、
データファールから1行読み込んで、書き出し、1行読み込んで書き出し
みたいにするのが現実的デスカ。
たとえばスレッドID、はじめのレス番号、最後のレス番号を与えると、
そのレスの内容を配列で返す。みたいな関数を作って、というのが楽そうだったのだけど、
あまりおすすめできないと言うことですね。
73(1): 名無しさん@お腹いっぱい。 [0] 2001/07/09(月)11:06 ID:??? AAS
そうすると、>>69はファイルロックの話も含めて、ネタか?
74: 名無しさん@お腹いっぱい。 [ ] 2001/07/10(火)22:56 ID:??? AAS
>>73
ファイルロックは必要。しないとログファイル壊れるよ。
75: 名無しさん@お腹いっぱい。 2001/07/10(火)23:59 ID:??? AAS
更新時に、
lock
更新対象読み込み
更新対象変更
更新対象書き込み
unlock
すれば、壊れないよ。
ただ、更新中に読む奴がいたら表示は狂う。
いちばんいいのは、全部一時ファイルに書き出して一気にrename。
これなら事実上ほとんど表示も狂わない。
省1
76: panton 2001/07/14(土)06:17 ID:8g/6IMoE(1/2) AAS
オヒザシブリデゴザイマス
IndexedFile.pm を更新しました。
外部リンク[pm]:www.panton.f2s.com
外部リンク[html]:www.panton.f2s.com
IO::Fileの使用廃止と、色々バグ修正があります。
前のバージョンには重大なバグがありました。
見つからなかったってことは、全然使われてねーんだな。
っと思って、手抜きテスト用ボードなんか用意してみました。
外部リンク[txt]:www.panton.f2s.com
外部リンク[txt]:www.panton.f2s.com (ソース)
省1
77: panton 2001/07/14(土)06:19 ID:8g/6IMoE(2/2) AAS
ぶっ、やっちまった。
外部リンク[cgi]:www.panton.f2s.com
テスト用ボードはこちらでございます。
78: _gunzip [ぺrlうせr@あねt。ね。jp] 2001/07/14(土)08:49 ID:??? AAS
では二つ三つ.......。
--------------------------
キー名に英数字以外のものが含まれているとおかしくなりますね。
("@threads"とか"perl-user"とか。)
196行目の
>my %hash = ('DUMMY', split /^(\w+?):/m, readline($self->_dathandle));
を
my %hash = ('DUMMY', split /^(.+?):/m, readline($self->_dathandle));
にすれば回避は出来ますが...。
--------------------------
省29
79: _gunzip [p_e_r_l_u_s_e_r] 2001/07/14(土)08:49 ID:??? AAS
あと、198行目の
>chomp $hash{$_} foreach keys %hash;
は、スライスで
chomp @hash{ keys %hash };
と書けたりします。(参考までに)
80: 名無しさん@お腹いっぱい。 [いちちちちt] 2001/07/15(日)07:23 ID:??? AAS
あっげ
81(2): 名無しさん@お腹いっぱい。 2001/07/16(月)17:17 ID:??? AAS
はじめまして。現在機能優先で掲示板を作っていて、コードの
効率は後回し中なのですが、いくつか質問があります。
・一般ではOpenでテキストを読み書きするのが多いようですが、
(MINIBBS程度の規模でも)TieやDBOPENを使ったものが見かけないのは
なぜですか?負荷について問題があるのでしょうか?
・発言データに関して、追加書き込みモードを基本にしてもファイルロックは
必要でしょうか?またどの程度の堅牢性を期待すべきでしょうか?
・読み出しに関して、基本的なスクリプトでは@LINE=<FILE>と
していますが、While(<FILE>)やその他の方法のうち、お勧め
なのはどれでしょうか?また、Seekを使った読み出しについて
省1
82(1): panton 2001/07/16(月)19:29 ID:YjhPdxYw(1) AAS
>>81
ageで書いてもいいんじゃないかと思うけどなんでsage?
> ・TieやDBOPENを使ったものが見かけないのはなぜですか?
> 負荷について問題があるのでしょうか
掲示板の場合リニアなデータ構造が多いのでハッシュがメインの
タイは不向きといえば不向き。配列を結びつける事も出来るが、
インターフェイスが不完全。
> ・追加書き込みモードを基本にしてもファイルロックは
> 必要でしょうか?
必要です。堅牢性についてはデータの重要性によります。
省7
83(1): 名無しさん@お腹いっぱい。 2001/07/16(月)19:58 ID:SlpU2cdo(1) AAS
>>82
age忘れです。
リニアな構造ということですが、発言IDやTIMEをキーにして
残りは従来のままスカラーでもよいと思ったんですが、、、。
負荷についてわからないというのは、ハッシュでは数百発言とも
なると負荷がかかるのかとか、あるいは値のサイズによって
負荷が変わるのかとかも考えたのですが。
追加書き込みモードについては、一般に恐れているのは
全部読み出し>退避+追加>全部書き出しの過程での全データ
消失だと思うので、追加書き込みでの危険性があまり認識
省1
84(1): panton 2001/07/17(火)15:17 ID:/BDSxh5c(1) AAS
>>83
リニアというのは、掲示板は発言の並びに順番があるということです。
TIMEなどをキーにしてkeysでsortなんかをすることも出来ますが、
DBMの起動オーバーヘッドなんかを考えると、
あえて使う必要も無いかなという程度です。
記事数や値のサイズによる負荷の増加は気にするほどではないと思いますが、
よく知りません。
ファイルロックについては、いろんなところで調べてみるといいと思います。
追記モードでも同時に起こると、ファイルの同じ位置に書き込もうとして
データがおかしくなります。
85(2): 名無しさん@お腹いっぱい。 2001/07/17(火)17:07 ID:sUEgTyfs(1) AAS
>>84
ありがとうございます。
あと他にも、疑問が生じたときに、理由は自分で考えてみたのですが
これでいいのでしょうか?
while (<FILE>)よりも@line <FILE>のほうが、読み込み時に
早くcloseを行うのでよさげ
・・・・>読み込み時は共有可、書き込み時はどっちみちロック
ANHTTP環境ではflock不可
・・・・>Renameロックかflockコメント化で我慢
全読み>全書き込みvs追加モード
省2
86(1): 名無しさん@お腹いっぱい。 [0] 2001/07/17(火)19:00 ID:??? AAS
特定の行を抜き出すとき、
$line = (<FILE>)[5];
っていう方法はどうなんですかね。
87: 名無しさん@お腹いっぱい。 2001/07/17(火)19:12 ID:HRgjK2II(1) AAS
>>86
それは最悪でしょう。
そいういうものこそDB_FileのDB_RECNOを使うほうが良いと思いますがね。
上下前次1-新書関写板覧索設栞歴
あと 417 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.012s