为什么Ruby CSV文件读取速度很慢?

时间:2013-09-26 23:59:18

标签: ruby csv

我有一个相当大的CSV文件,有4百万条记录,有375个字段,需要处理。 我使用RUBY CSV库来读取此文件并且速度非常慢。我认为PHP CSV文件处理速度很慢,但比较两次读取PHP的速度要快100倍。我不确定我是不是做了一些愚蠢的事情,或者这只是RUBY没有针对这种类型的批处理进行优化的现实。我设置了简单的测试pgms来获得RUBY和PHP的比较时间。我所做的就是读取,不写入,不构建大型数组,并在处理50,000条记录后突破CSV读取循环。还有其他人遇到过这个性能问题吗?

我在具有4 GB内存的MAC上本地运行,运行OS X 10.6.8和Ruby 1.8.7。

Ruby进程只需497秒即可读取50,000条记录,PHP进程在4秒内运行,这不是一个错字,它的速度要快100倍。仅供参考 - 我在循环中有代码打印出数据值,以确保每个进程实际上正在读取文件并将数据带回来。

这是Ruby代码:

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";

3 个答案:

答案 0 :(得分:5)

只需更新到当前版本的Ruby,您就可以获得巨大的速度提升。在版本1.9中,FasterCSV被集成为Ruby的标准CSV库。

查看Chruby以管理不同的Ruby版本。

答案 1 :(得分:2)

查看smarter_csv Gem,它有通过读取数据块来处理大文件的特殊选项。

它还将CSV数据作为哈希值返回,这样可以更容易地在数据库中插入或更新数据。

答案 2 :(得分:0)

我认为使用CSV对此有点矫枉过正。

很久以前我看到了这个问题,Ruby的缓慢原因在于它将整个CSV文件一次加载到内存中。我看到有些人使用IO class克服了这个问题。例如,请查看this gistself.perform(url)方法。