プログラマ ずんべ の日記

zunbe

プログラマ ずんべ の日記
プログラマ ずんべ の日記

探し物は見つかりましたか? サイト内検索を試してください。

(その2) 数ギガバイトのデータを読むんだぞ (その2) 数ギガバイトのデータを読むんだぞ (その4) sprintfごとき、きちんと使え (その4) sprintfごとき、きちんと使え

2005/07/20

【若いモンの発想はわからん】(その3) 何万行も処理するんだぞ

最近、年のせいか、愚痴っぽくなった。
しかし、あまりの発想の貧弱さ、あまりの知識の無さには、正直言って腹が立つ。

今日も、こんな事があった。

先に指示したフィルタ・プログラムで、社員は以下の様なプログラムを書いた。

-----
open(EOUT, '>hoge.txt');

foreach (<STDIN>)
{
     :
  if (エラー発生?)
  {
    print EOUT "エラーの内容";
  }
     :
}

close(EOUT);
-----

ずんべは、このプログラムに対して、以下の様な修正指示を出した。

エラーの出力がバッファに溜まったままプログラムがこけると、エラーのダンプが無いまま終わってしまい、発生したエラーの状況が把握できない。
エラーの出力はバッファリングしないように修正しなさい。

この指示に対して、社員が行った修正は、こうだ。

-----
foreach (<STDIN>)
{
  open(EOUT, '>>hoge.txt');
     :
  if (エラー発生?)
  {
    print EOUT "エラーの内容";
  }
     :
  close(EOUT);
}
-----

我が目を疑った。
正気で書いたコードとは思えない。
何百メガもあるデータを1行読むたびに、エラーファイルを毎回オープンし直すだと?
これでは、処理速度が遅すぎて、使い物にならんではないか。
マシンにも余計な負荷がかかる。

若いモンの発想は理解できん。



このエピソードはいかがでしたか?

投稿者 zunbe : 2005/07/20 09:05:19


コメント

 正解がやや難しい?気がしますが、

 ・エラーの割合がごく少ないなら、「エラー発生」の中でのみファイルオープン/クローズ

 ・エラーが結構な量あるなら・・・
  http://flex.ee.uec.ac.jp/texi/perl/perl_161.html#SEC226

  このパラメータでエラー書き出しを毎回フラッシュするようにする?
 (この場合、プログラムがこけて close されないのは、やや困ります・・・。)


ずんべさんが言いたいのは前者だと思いますが・・・。

投稿者 GOTTi : 2005/07/20 11:54:59

> ・エラーの割合がごく少ないなら、「エラー発生」の中でのみファイルオープン/クローズ

なるほど、エラーの量がごく少ないなら、これもアリですね。


> ・エラーが結構な量あるなら・・・

正解は、こうですね。

-----
# EOUTを選択。同時に現在の選択ハンドルを退避。
$oldh = select(EOUT);

# EOUTを「バッファしない」に。
$| = 1;

# 選択ハンドルを元に戻す。
select($oldh);
-----

プログラムがコケた時は、OSの自動closeに期待するしかありません(本来、そうならないように、エラーをトラップして制御されるべき)が、バッファリングせずに出力していれば、少なくとも、printしたところまではファイルに吐き出されているので、エラーの状況は把握できる。
「tail -f」で動作状況をモニターする事も可能である。

> ずんべさんが言いたいのは前者だと思いますが・・・。

問題の解決は、プログラムが使用される状況を把握した上で、正しく解決されるのであれば、どちらの方法でも構わないと思います。
しかし、問題としているのは、そこではなく、

・何十万回も回るループの中で、open/closeを繰り返すという発想

です。

このコードは、どう考えても不適切です。

少なくとも、ここに挙げた2つの解決策があるわけです。
探せば、もっといろいろな方法があるでしょう。
それを考え出す事ができない発想力の乏しさと、知識の無さが問題なのです。

投稿者 ずんべ : 2005/07/20 12:13:20

 僕は、一応正解にはたどり着けましたか・・。


 おっしゃるとおり、「知識」の量が絶対的に欠けている感じですね。

 僕はここ何年も Perl なんて使っていませんが、それでも(ずんべさんがある程度ヒント書いてくれているというのもありますが)バッファリングしないようにという要求について、何を調べればよいのか、というポイントが分かるので、ウェブで検索して $| というものにたどり着きました。(数分)

# これを使ったことはありません。

 
 じゃあその知識をどのように身につけてもらうのか?というのは、また難しい問題ですよね・・・。
 「情報処理試験受けて、合格したらボーナスが出る」ということにして、それで勉強してくれたとしても、効果が出るかどうかは微妙ですし、本質的ではないですもんね。

(ずんべさんがおっしゃってたように、2年以上もプログラマをやっていれば、当然知っていて欲しい、という部分あります) 

投稿者 GOTTi : 2005/07/20 15:12:05

> 何を調べればよいのか、というポイントが分かるので

そう、その通り。
問題が出されたときに、その答えがわかっている必要はないと思いますが、その答えを正しく導き出せるかどうかが重要なのです。
その答えを導き出すのは、知識であり、経験とも言えます。
そして、ただ長い時間やっているだけなのは経験ではなく、問題を解決する努力を積み挙げていかなければ、知識にはなりません。

> じゃあその知識をどのように身につけてもらうのか?

それが簡単にできるなら苦労はありませんが、結局は本人がやる気を出すかどうかです。
未だに、自宅でパソコンを持っていない、インターネットにも繋いでいない、という程度では、自己啓発なんぞ、夢のまた夢です。

投稿者 ずんべ : 2005/07/20 16:33:50


コメントしてください






保存しますか?


スパム対策:
この入力フィールドに「19」と入力してください。


プログラマ ずんべ の日記:ずばヒット アマゾン