読者です 読者をやめる 読者になる 読者になる

本当は怖い情報科学

情報系大学院生の趣味&実益ブログ。

StreamSamplerを書きなおした

以前にPythonで書いたStreamSampler(Reservoirアルゴリズムによってデータからランダムに要素を取り出すプログラム)なのだが、C++で書きなおした。実際に使ってみて、かなりCPU負荷が高くて困っていたからだ。例えば、

$ bzcat data.bz2 | python streamsampler.py | grep "..." | bzip2 >data2.bz2

と言ったようなデータ処理をよく行うのだが、この処理を実行中にtopコマンドで負荷を観察すると必ずPythonが95%以上の負荷を使っているのだ。理想的には、この場合はディスクからの読み込みがボトルネックになるべきであって、それならbzip2, bzcatを含めてすべてのプロセスが数十%程度の負荷に見えるはずだ。

Pythonスクリプトをプロファイリングしてチマチマと最適化しても良いのだが、処理自体が単純なのでそこまでドラスティックな高速化は望めないし、C++で書きなおしても一瞬なので書きなおすことにした。

コードは以下。

https://gist.github.com/keisukefukuda/9045926

【広告】