2013-02-01 110 views
6

我已经看到了这个问题的答案,但我无法弄清楚哪个答案会表现最快。这些是我见过的答案 - 哪个最好?使用每个或each_line 在Ruby中读取大文件的最快方法是什么?

  • 使用在时间读取一行在一个时间

    1. 读取一行得到
    2. 保存所有到使用readlines方法线的阵列,然后使用每个
    3. 使用grep(不知道与grep究竟是什么......)
    4. 使用sed(不知道究竟是什么与sed ...
    5. 还有其他?

    另外,使用其他语言还是应该更好?

    编辑:

    更多细节:每行包含类似 “ID1 attr1_1 attr2_1 ID2 attr1_2 attr2_2 ... IDN attr1_n attr2_n”(n是非常大的),我需要那些插入到数据库中。对于该示例行,我需要将n行插入到数据库中。

  • +6

    什么是“大”文件?你在做什么?表现是否重要?你有没有尝试过基准测试? –

    +0

    至少* 500,000行和每行数万个字符。对于每一行,我都会对数据库做些什么。性能确实很重要。我没有做任何基准测试,但我想知道是否有明显的答案,根据他们的工作方式,哪些答案会更快或更慢。 – user1136342

    +0

    该文件是本地文件吗? – gmalette

    回答

    4

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

    我不建议把grepsed,或任何其他这样的外部事业进入画面,除非你有一个非常充分的理由,因为它们会使你的代码的可移植性和揭露你的失败,可能很难诊断。

    2

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

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

    这是倡导脚本语言用于快速开发而不是快速运行时间的想法。因为这样的开发人员可以通过像Ruby那样快速“原型化”程序来提高生产力,只有在稍后重写组件才能保证一些低级代码。然而,通常情况下,一旦它在脚本中工作,就没有必要做任何其他事情。

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

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

    相关问题