![]() |
zunbe |
![]() |
|
![]() |
(その2) 数ギガバイトのデータを読むんだぞ | (その4) sprintfごとき、きちんと使え | ![]() |
2005/07/20
最近、年のせいか、愚痴っぽくなった。 今日も、こんな事があった。 先に指示したフィルタ・プログラムで、社員は以下の様なプログラムを書いた。 ----- foreach (<STDIN>) close(EOUT); ずんべは、このプログラムに対して、以下の様な修正指示を出した。 エラーの出力がバッファに溜まったままプログラムがこけると、エラーのダンプが無いまま終わってしまい、発生したエラーの状況が把握できない。 この指示に対して、社員が行った修正は、こうだ。 ----- 我が目を疑った。 若いモンの発想は理解できん。
投稿者 zunbe : 2005/07/20 09:05:19
正解がやや難しい?気がしますが、 ・エラーの割合がごく少ないなら、「エラー発生」の中でのみファイルオープン/クローズ ・エラーが結構な量あるなら・・・ このパラメータでエラー書き出しを毎回フラッシュするようにする?
投稿者 GOTTi : 2005/07/20 11:54:59 > ・エラーの割合がごく少ないなら、「エラー発生」の中でのみファイルオープン/クローズ なるほど、エラーの量がごく少ないなら、これもアリですね。
正解は、こうですね。 ----- # EOUTを「バッファしない」に。 # 選択ハンドルを元に戻す。 プログラムがコケた時は、OSの自動closeに期待するしかありません(本来、そうならないように、エラーをトラップして制御されるべき)が、バッファリングせずに出力していれば、少なくとも、printしたところまではファイルに吐き出されているので、エラーの状況は把握できる。 > ずんべさんが言いたいのは前者だと思いますが・・・。 問題の解決は、プログラムが使用される状況を把握した上で、正しく解決されるのであれば、どちらの方法でも構わないと思います。 ・何十万回も回るループの中で、open/closeを繰り返すという発想 です。 このコードは、どう考えても不適切です。 少なくとも、ここに挙げた2つの解決策があるわけです。 投稿者 ずんべ : 2005/07/20 12:13:20 僕は、一応正解にはたどり着けましたか・・。
僕はここ何年も Perl なんて使っていませんが、それでも(ずんべさんがある程度ヒント書いてくれているというのもありますが)バッファリングしないようにという要求について、何を調べればよいのか、というポイントが分かるので、ウェブで検索して $| というものにたどり着きました。(数分) # これを使ったことはありません。 (ずんべさんがおっしゃってたように、2年以上もプログラマをやっていれば、当然知っていて欲しい、という部分あります) 投稿者 GOTTi : 2005/07/20 15:12:05 > 何を調べればよいのか、というポイントが分かるので そう、その通り。 > じゃあその知識をどのように身につけてもらうのか? それが簡単にできるなら苦労はありませんが、結局は本人がやる気を出すかどうかです。 投稿者 ずんべ : 2005/07/20 16:33:50
|
|
|