処理が必要な 375 フィールドの 400 万レコードを含む、かなり大きな CSV ファイルがあります。このファイルを読み取るために RUBY CSV ライブラリを使用していますが、非常に低速です。PHP CSV ファイルの処理は遅いと思っていましたが、2 つの読み取りを比較すると、PHP は 100 倍以上高速です。私が愚かなことをしているのか、それともこれがこの種のバッチ処理に最適化されていないRUBYの現実なのかはわかりません。簡単なテスト pgms をセットアップして、RUBY と PHP の両方で比較時間を取得しました。私がすることは、読み取るだけで、書き込みもせず、大きな配列の作成もせず、50,000 レコードを処理した後に CSV 読み取りループから抜け出します。他の誰かがこのパフォーマンスの問題を経験しましたか?
OS X 10.6.8 と Ruby 1.8.7 を実行し、4 ギガのメモリを搭載した MAC でローカルに実行しています。
Ruby プロセスは単純に 50,000 レコードを読み取るのに 497 秒かかります。PHP プロセスは 4 秒で実行されますが、これはタイプミスではなく、100 倍以上高速です。参考までに、各プロセスが実際にファイルを読み取ってデータを戻していることを確認するために、ループ内にデータ値を出力するコードがありました。
これはルビーコードです:
require('time')
require('csv')
x=0
t1=Time.new
CSV.foreach(pathfile) do |row|
x += 1
if x > 50000 then break end
end
t2 = Time.new
puts " Time to read the file was #{t2-t1} seconds"
PHPコードは次のとおりです。
$t1=time();
$fpiData = fopen($pathdile,'r') or die("can not open input file ");
$seqno=0;
while($inrec = fgetcsv($fpiData,0,',','"')) {
if ($seqno > 50000) break;
$seqno++;
}
fclose($fpiData) or die("can not close input data file");
$t2=time();
$t3=$t2-$t1;
echo "Start time is $t1 - end time is $t2 - Time to Process was " . $t3 . "\n";