PHPでCSV解析を行う関数を作ったので性能を検証してみた。1行144文字の100万行のCSVファイルをパースして総なめする。すると12秒ほどかかった。この関数は
- 読み込んだカラムをすべて配列で取得する
という関数で、内部ではバッファに文字を溜めてそれを配列に格納して返り値として返している。
for文のループでカウント変数をカウントするだけのコードで同じ100万行のCSVファイルをなめてみたがこれは0.5秒ほどで終わる。ということはこの関数のコストは11.5秒ほどである。100万行に12秒かかるとレコード数が100万行に達したらそれだけ時間がかかるということで、12秒待つのはなかなかしんどいと思うので、現実的なコストとは言えない。
そこで特定のカラムだけバッファに格納してそれを文字列として返す関数を作ってみたら、これは9秒ほどかかった。そうすると3秒ほど短縮できた。
特定のカラムを検索したい場合にこの関数を使い、レコードのカラム全てを取得したい場合は添え字を戻して12秒の関数を使えば、効率化はできる。ただ、それでも最悪コストは9秒ほどである。
データベースを使った場合はどれぐらいのコストがかかるのか比較したほうがいいだろう。CSVの解析は時間がかかる。
また生PHPでコードを書くのではなくC言語によるPHP関数の作成も比較したいところである。C言語で書けばもっと速くなるだろう。
これらの関数とは別に1行スキップするだけの関数も作った。これは同じCSVファイルで5秒ほどかかった。そうするとバッファと配列の処理に7秒ほど使ってることになる。しかし一行カウント変数とif文で読み込むだけで5秒は最低でもかかるということで、ここら辺は処理系の限界なのかもしれない。