StreamSamplerを書きなおした
以前にPythonで書いたStreamSampler(Reservoirアルゴリズムによってデータからランダムに要素を取り出すプログラム)なのだが、C++で書きなおした。実際に使ってみて、かなりCPU負荷が高くて困っていたからだ。例えば、
$ bzcat data.bz2 | python streamsampler.py | grep "..." | bzip2 >data2.bz2
と言ったようなデータ処理をよく行うのだが、この処理を実行中にtopコマンドで負荷を観察すると必ずPythonが95%以上の負荷を使っているのだ。理想的には、この場合はディスクからの読み込みがボトルネックになるべきであって、それならbzip2, bzcatを含めてすべてのプロセスが数十%程度の負荷に見えるはずだ。
Pythonスクリプトをプロファイリングしてチマチマと最適化しても良いのだが、処理自体が単純なのでそこまでドラスティックな高速化は望めないし、C++で書きなおしても一瞬なので書きなおすことにした。
コードは以下。