|
|
||
Faster CSV with FasterCSV - O’Reilly Ruby 経由。
Ruby 標準添付の csv パーサが鬼のように遅いので FasterCSV を試してみました。
速いということは "" などは無視して手を抜いて parse しているのかと一瞬疑ってしまったのですが、quote された field もちゃんと扱えました ("" 内の改行文字として LF と CRLF 両方 ok でした)。
# もちろん標準添付の csv も扱えます。
% cat a.csv
"a""aa","b
bb","ccc"
zzz,yyy,xxx
% ruby -rfaster_csv -e "FasterCSV.foreach(ARGV.shift){|row| p row}" a.csv
["a\"aa", "b\nbb", "ccc"]
["zzz", "yyy", "xxx"]
あと、pure ruby なので Windows な人でもインストールが楽なのがうれしい (gem もあるし)。
で、せっかくなのでベンチマークをとってみました。
環境は以下のとおりです。
| CPU | Pentium 4 2GHz (HT なし) |
|---|---|
| メモリ | 1G (512 * 2) |
| HD | SAMSUNG SV0602H |
| OS | Windows XP Professional SP2 |
テスト用の csv データは 郵便番号 csv の 全国一括 を以下のようにして 3 倍したものを利用しました。
> cat KEN_ALL.CSV KEN_ALL.CSV KEN_ALL.CSV > KEN_ALL3.CSV
csv を parse して行数を数えるだけのスクリプト(後述)の実行時間を GNU time で測定しました。
| 対象 | 結果 |
|---|---|
| ruby 1.8.4 + 標準添付の csv | 12分26秒56 |
| ruby 1.8.4 + FasterCSV 0.1.9 | 2分34秒92 |
FasterCSV は標準添付の csv パーサの 5〜6 倍速いようです。
ついでに他の LL の結果。
| 対象 | 結果 |
|---|---|
| perl 5.8.6 + Text::CSV_XS 0.23 | 37秒46 |
| python 2.4.2 + 標準添付の csv | 3秒46 |
orz... (まぁ pure ruby だししょうーがないか)
csv を parse して行数を表示するだけです。
require "csv" n = 0 CSV.open(ARGV.shift, "r") do |row| n += 1 end puts n
require "faster_csv" n = 0 FasterCSV.foreach(ARGV.shift) do |row| n += 1 end puts n
use strict; use warnings; use IO::File; use Text::CSV_XS; my $io = IO::File->new(shift(@ARGV), "r"); my $csv = Text::CSV_XS->new({binary => 1}); my $n = 0; while (not $io->eof and $csv->getline($io)) { $n++; } print "$n\n";
import sys import csv reader = csv.reader(file(sys.argv[1])) n = 0 for row in reader: n += 1 print n
>ruby -v ruby 1.8.4 (2005-12-24) [i386-mswin32] >time ruby csv.rb KEN_ALL3.CSV 364755 0.01user 0.01system 12:26.56elapsed 0%CPU (0avgtext+0avgdata 5792maxresident)k 0inputs+0outputs (441major+0minor)pagefaults 0swaps
>time ruby fastercsv.rb KEN_ALL3.CSV 364755 0.01user 0.01system 2:34.92elapsed 0%CPU (0avgtext+0avgdata 5744maxresident)k 0inputs+0outputs (438major+0minor)pagefaults 0swaps
>perl -v | grep perl, This is perl, v5.8.6 built for MSWin32-x86-multi-thread >time perl csv_xs.pl KEN_ALL3.CSV 364755 0.03user 0.01system 0:37.46elapsed 0%CPU (0avgtext+0avgdata 5744maxresident)k 0inputs+0outputs (438major+0minor)pagefaults 0swaps
>python -V Python 2.4.2 >time python csv.py KEN_ALL3.CSV 364755 0.01user 0.01system 0:03.46elapsed 0%CPU (0avgtext+0avgdata 5808maxresident)k 0inputs+0outputs (441major+0minor)pagefaults 0swaps
Pythonの2〜3倍くらいの実行時間にまで早くなりましたw