【问题标题】:Why is Ruby CSV file reading very slow?为什么 Ruby CSV 文件读取速度很慢?
【发布时间】:2013-10-03 03:41:17
【问题描述】:

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

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

Ruby 进程读取 50,000 条记录需要 497 秒,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";

【问题讨论】:

  • 你的问题到底是什么?
  • 首先升级你的 Ruby。 1.8.7 的 CSV 很慢,另外,与今天的 Ruby v2.0 相比,它的速度非常慢。
  • Mike,我正在尝试了解是否有其他人遇到此性能问题,以及他们是否能够解决它?正如 Tin Man 指出的那样,它可能与我的版本有关,因为 1.8.7 的 CSV 库似乎很慢。

标签: ruby csv


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • CSV.foreach 一次读取一行。见:ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/…
      • 大声笑我完全忽略了这一点。我确信 CSV.foreach 首先将所有内容加载到内存中。
      • 对于 Eric 正在使用的 1.8.7 Ruby,它可能是 :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多