Previous: mheader CSVデータの項目名配列取得メソッド Up: モジュールメソッド Next: mkDir ディレクトリの作成メソッド RubyM
RubyM : モジュールメソッド : mrecount CSVデータの行数計算メソッド

3.3 mrecount CSVデータの行数計算メソッド

CSVデータファイルを行単位で処理するためのクラス。以下のような特徴を持つ。

  • C++で実装されており非常に高速に動作する(wc -lより若干高速)。

  • 一行目の項目名行を除いたデータの行数のみカウントする。

  • 単純に改行charをカウントしているだけなので、ダブルクォーテーションでエスケープされた改行もカウントしてしまう。 この問題を避けたい場合はMCMD::Mtableを利用する。

3.3.1 書式

MCMD::mrecount(arguments)

argumentsに、以下の引数をスペースで区切った文字列として指定する。

i=

入力ファイル名(String)

-nfn

1行目を項目名と見なさない。

3.3.2 利用例

例1 項目名の出力と行番号・値の出力

# dat1.csv
顧客,日付,金額
A,20081201,10
B,20081002,40

p MCMD::mrecount("i=dat1.csv")      # -> 2
p MCMD::mrecount("i=dat1.csv -nfn") # -> 3

3.3.3 関連コマンド

Mtable : CSVデータのセル単位での読み込み操作

3.3.4 ベンチマークテスト

CSVデータの行数カウント処理について、UNIXコマンドwcとMtableをベンチマークにした速度比較を行う。 Table 3.1にベンチマークテストの結果を示す。 100万,200万,300万,400万行,500万行のデータについて実験を行った。 Figure 3.1には、ベンチマークテストで利用したスクリプトの抜粋が示されている。 mrecountはwcに比べて若干高速である。 またMtableは行数をカウントすることのみを目的としたクラスではないが、 比較すると、5〜6倍高速である。

Table 3.1: 各種CSVライブラリの実行速度比較(単位:秒)

行数

1000K

2000K

3000K

4000K

5000K

mrecount

0.034

0.066

0.097

0.129

0.161

wc -l

0.038

0.070

0.103

0.133

0.169

Mtable

0.231

0.407

0.503

0.731

0.828


10回実行した結果の平均値(real time)を示している。
行数1000Kは100万行の意味。データのサイズは行数が1000Kで約25Mバイト。項目数は5つ。
テスト環境: Mac Book Pro, 2.66GHz Intel Core i7, 8GB メモリ, Mac OS X 10.6.8
require 'rubygems'
require 'mtools'

require 'benchmark'

puts Benchmark.measure{
  (0...10).each{|i|
    # mrecountの場合
    p MCMD::mrecount("i=data.csv")

    # wcの場合
    system "wc -l data.csv"

    # Mtableの場合
    MCMD::Mtable("i=data.csv -array"){|tbl|
			p tbl.recordSize
    }
  }
}
Figure 3.1: ベンチマークテストのスクリプト(抜粋)
Previous: mheader CSVデータの項目名配列取得メソッド Up: モジュールメソッド Next: mkDir ディレクトリの作成メソッド RubyM