テキストファイル1行の字数制限は?

[上に] [前に] [次に]
水野 2000/02/14(月) 19:20:35
ものすごくバカな質問かもしれません。
掲示板などのCGIのログを
テキストファイルに記録していますが、
この場合、1行がどんなに長くても
いいものなんでしょうか?
極端な話、掲示板のログすべてを1行に
記録するようなことをしてもいいのでしょうか。
単に改行(\n?)を出力しないだけで
一行でも複数行でも同じ事だと
自分では思っていたんですが、
なんだか急に不安になりまして…。
何か問題があるようでしたら教えてください。
よろしくお願いいたします。

EMI 2000/02/14(月) 19:27:11
基本的に、制限はありません。
まぁ、長すぎるとPerlの行入力演算子<>などでエラーを出す可能性があるかもしれないけどね。:-P

ラウォッチ 2000/02/15(火) 11:06:42
vi なんかは一行 1023バイトです。
HTML的には EMIさんとおなじで、制限はないと思います。

私のCGIの場合、
$body =~ s/\r\n/<BR>/g; (PC系の改行処理)
$body =~ s/\r/<BR>/g;  (Mac系の改行処理)
$body =~ s/\n/<BR>/g;  (UNIX系の改行処理)
$body =~ s/<BR>/<BR>\n/g;(HTMLソースとログデータを見やすく)

$bodyは フォームからの入力データ(文字列)です。

こうすると、ログデータを viで見たときらくです。

水野 2000/02/16(水) 05:38:06
EMIさん、ラウォッチさん、ありがとうございます。
>長すぎるとPerlの行入力演算子<>などで
>エラーを出す可能性があるかもしれない
というのが不安なのですが…。
行入力演算子にはそういう制限があるのでしょうか?

Ichi 2000/02/16(水) 06:22:22
>行入力演算子にはそういう制限があるのでしょうか?
処理系に依存します。
もし、文字列の長さを8ビットで管理していれば、255文字までしか使えませんし、
16ビットで管理していれば、65535文字までしか使えません。
Cのように特殊な文字(例えばNULL文字)を文字列の終了に使うという方法もあります。

というわけで、一行100000文字くらいのファイルを読みこませて、
あなたの処理系で正常に読みこめるかテストしてみてはどうでしょう。

B-Cus 2000/02/16(水) 07:04:49
> もし、文字列の長さを8ビットで管理していれば、255文字までしか使えませんし、
> 16ビットで管理していれば、65535文字までしか使えません。
え〜。そういう問題かなぁ。要は perl がメモリを
どこまで確保できるか (OS がどこまでメモリ確保を
許してくれるか) ってことじゃないですか?


<> は、改行コードが出てくるまで永遠に次の文字を
読み続けます。最初に確保したバッファが足りなくなったら
(perl が) さらにメモリを確保します。もし確保できなければ
そこで perl は落ちます。

悪いのは改行云々でなく、一度にメモリをたくさん使うことです。
なので、メモリに一度に格納してしまうという意味では、
 @buf = <IN>;
も同じくらい「ダメ」な書き方です。


ちなみに、僕が許せるのは1行につき数十KB、多くて数百KB です。
実際のところ、現在の PC 環境では 50MBや 100MB 程度はいける
かもしれません。しかし、そういうギリギリのところまでやっちゃうと、
swap が起こり、スラッシング (http://www.ascii.co.jp/ghelp/5/000541.html)
が発生し、実行速度は低下します。

「100MB分の領域を確保する時間」は、「1MB分確保する時間の100倍」を
越えます。200倍かもしれませんし、300倍であってもおかしくありません。
1000倍だって有り得ます。


なので、1行はある程度の長さに抑えておくべきです。
より正確な言い方をすると、一度に大量のメモリを
使うような状況は可能な限り避けるべきです。


はっきり言うと、ログを全て一行にしてしまうような掲示板を
見かけたら、プログラミングセンスを疑います。実行効率も
もちろんですが、メンテナンス性、デバッグのしやすさを
全く考えていないということでしょうから。

水野 2000/02/17(木) 00:11:38
[[解決]]
Ichiさん、B-Cusさん、ありがとうございます。

今使用している掲示板に返信機能をつけたいと思い、
元の投稿とそれに対する返信とを
一行で扱おうと思っているのですが、
返信が多くなってもきちんと処理できるのか
不安になってこんな質問をしました。
ローカルで実験をしてみましたが、
数十KBになるようなことはまずないので、
とりあえず大丈夫なようです。
しかしあまり長くなるのも嫌なので、
投稿に字数制限をするようにしました。

丁寧に説明していただいてありがとうございました。

[上に] [前に] [次に]