4

処理が必要な 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";
4

3 に答える 3

5

現在のバージョンの Ruby に更新するだけで、大幅な速度向上が得られる可能性があります。バージョン 1.9 では、FasterCSVが Ruby の標準 CSV ライブラリとして統合されました。

Chrubyをチェックして、さまざまな Ruby バージョンを管理してください。

于 2013-09-27T00:03:55.033 に答える
2

smarter_csv Gem を確認してください。これには、データをチャンクで読み取ることによって巨大なファイルを処理するための特別なオプションがあります。

また、CSV データをハッシュとして返すため、データベースへのデータの挿入や更新が容易になります。

于 2013-09-27T00:12:41.493 に答える
0

これには、 CSVを使用するのは少しやり過ぎだと思います。

ずいぶん前にこの質問を見ました。Ruby が遅い理由は、CSV ファイル全体を一度にメモリにロードするためです。IO クラスを使用することで、この問題を解決した人もいます。たとえば、その方法については、この要点を見てください。self.perform(url)

于 2013-09-27T00:07:35.100 に答える