本当は怖いHPC

HPC屋の外部記憶装置。メモ書き。ちゃんとしたものは別のところに書く予定です

最近、大量のテキストファイルでデータ処理をするプログラムを書いていたのですが、色々学んだので、まとめメモです。Effective C++風。ファイルを読んでファイルに書き出すプログラムを主に想定してます。あと、特にPerlに依存した話ではないです。


1. 入力データが正しく、整合性が取れているか確認しよう

面倒でも、(特にCSVファイルは)キチンとチェックしましょう。空行があったり、項目が足りなかたりとか。


2. 読み込み・処理をするだけで書き出しはしないオプションを用意しよう
UNIX系OSのパッケージ管理システムに良くある機能ですね。


3. 出力ファイルの日付を調べて処理するかどうかを判定するオプションを用意しよう

makeの原理です。入力ファイルが大量にある場合は、デバッグ段階で非常に役に立ちます。


4. --quiet / --verbose オプションを用意しよう

デバッグ出力の多寡を切り替えるオプション。


5. 標準出力から読み、標準出力に書き出せるようにしよう

単一ファイルを処理するプログラムの場合は、標準出入力を用いた処理が出来ると重宝します


6. ファイルの作成/書きかえはアトミックにしよう

「アトミック」というと語弊がありますが、Perlの出入力を用いた場合、Ctrl-Cで割り込みが入った場合にファイルの内容が中途半端になってしまうことがたまにあります。なので、ファイルに出力する時は、一時ファイルに書き出してからrenameするほうが安全性が高い(はず)です(ファイル名の変更は実質的にOSのシステムコール呼び出しなので)。


7. 中間ファイルを活用して処理時間を短縮する事を考えよう

そのまんま


8. 場合によっては、外部コマンドを活用することも考えよう

処理すべきファイルがあまりにも大量にある場合は、grep・findなどをうまく使って前処理をすると、速度を向上させることが出来ます。



こういうのって、定型的な部分は共通化できますよね。上の項目に従えば、ファイルの読み書きを自動化しなくちゃいけないからロジック自体はフィルタとして書くことになるな。うん、そうすればロジックと出入力が完全に分離できるから、出入力は別にディスク上のファイルじゃなくてもいいってことになるね。てことは、データの形式も、CVSとかYAMLとかXMLとかRDBとか、設定ファイルで指定するようにすれば柔軟性が高まるよね。

…ってちょっと待てよ、このパターンはもしや