在Ruby中读取大文件的最快方法是什么?

时间:2013-02-01 20:38:20

标签: ruby-on-rails ruby performance file io

我已经看到了这个问题的答案,但我无法弄清楚哪个答案能够以最快的速度完成。这些是我见过的答案 - 哪个最好?

  1. 使用each或each_line一次读取一行
  2. 使用gets
  3. 一次读取一行
  4. 使用readlines将所有内容保存到一个行数组中,然后使用每个
  5. 使用grep(不确定与grep有什么关系......)
  6. 使用sed(不确定与sed究竟有什么关系......)
  7. 别的什么?
  8. 另外,使用其他语言或者Ruby应该没问题会更好吗?

    编辑:

    更多细节:每行包含类似“id1 attr1_1 attr2_1 id2 attr1_2 attr2_2 ... idn attr1_n attr2_n”(n非常大),我需要将它们插入数据库。对于该示例行,我需要在数据库中插入n行。

2 个答案:

答案 0 :(得分:4)

Ruby可能会使用相同或非常相似的低级代码(用C语言编写)来从磁盘实际读取前三个选项,因此它们应该执行类似的操作。鉴于此,您应该选择最适合您的方式;这样做的能力使像Ruby这样的语言非常有用!您将从磁盘读取 lot 数据,因此我建议您在阅读时使用each_line并处理每一行。

我不建议将grepsed或任何其他此类外部工具添加到图片中,除非您有非常充分理由,因为他们会制作您的代码不太便携,并使您面临可能难以诊断的故障。

答案 1 :(得分:2)

如果您使用的是Ruby,则无需担心性能问题。语言是这样的,它适合逐行读取文件的迭代方法,并且工作得非常好。只要你按照设计的方式使用语言,你就可以让翻译人员担心性能问题。完成工作。

如果需要一个特定的readLargeFileFast方法,那应该是因为它确实以某种方式阻碍了程序。现在,您编写了一个C程序来执行此操作,并popen将其作为ruby代码中的单独进程。您可以将其称为read_large.c并且(可能)使用命令行参数来告诉它如何表现。

这支持了一种思想,即脚本语言用于快速开发而不是快速运行。因为这样的开发人员可以非常高效地通过像Ruby这样的程序快速“原型化”程序,并且稍后重写组件保证一些低级代码。然而,通常,一旦它在脚本中工作,就没有必要做任何其他事情了。

Ruby Docs描述启动一个单独的进程并将其视为文件。这很容易!一个好的开始是“Linux编程艺术”在program modularity的介绍性段落。本书也是使用linux标准流编辑器的一个很好的例子,名为sed,你现在可以在Ruby中使用它。

如果您需要解析或编辑大量文本,那么很多解释器或编辑器都是围绕sed的功能编写的。此外,如果你不知道C.它可能会为你节省很多精力来写一些超级高效的东西。好的是Bruce Barnett的Introduction to SED