*Trace Output* このページをアンテナに追加 RSSフィード Twitter

アーカイブ | プロフィール
 | 

2006-03-01

FasterCSV のベンチマーク

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 もあるし)。


で、せっかくなのでベンチマークをとってみました。

環境

環境は以下のとおりです。

CPUPentium 4 2GHz (HT なし)
メモリ1G (512 * 2)
HDSAMSUNG SV0602H
OSWindows 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 + 標準添付の csv12分26秒56
ruby 1.8.4 + FasterCSV 0.1.92分34秒92

FasterCSV は標準添付の csv パーサの 5〜6 倍速いようです。


ついでに他の LL の結果。

対象結果
perl 5.8.6 + Text::CSV_XS 0.2337秒46
python 2.4.2 + 標準添付の csv3秒46

Pythonruby の約 245 倍速いようです。

orz... (まぁ pure ruby だししょうーがないか)


まとめ

CSV の解析なら Python で。



ソース

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
  • perl (Text::CSV_XS)
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 (Text::CSV_XS)
>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

moonwolfmoonwolf 2006/06/02 14:28 flexを使ってFastestCSVという拡張ライブラリを書いてみました。
Pythonの2〜3倍くらいの実行時間にまで早くなりましたw

 |