如何在Ruby中快速读取大文件?

8
我看到了这个问题的答案,但是我无法确定哪个答案执行速度最快。以下是我看到的答案-哪一个最好?
  1. 使用each或each_line逐行读取
  2. 使用gets逐行读取
  3. 使用readlines将其全部保存到一组行中,然后使用each
  4. 使用grep(不确定如何使用grep...)
  5. 使用sed(不确定如何使用sed...)
  6. 其他方法?
此外,是使用另一种语言更好还是Ruby就可以?
编辑:
更多细节:每行都包含类似于“id1 attr1_1 attr2_1 id2 attr1_2 attr2_2... idn attr1_n attr2_n”的内容(n非常大),我需要将它们插入数据库。对于该示例行,我需要将n行插入数据库。

7
什么是“大文件”?你用它做什么?性能真的很重要吗?你尝试过进行基准测试吗? - Dave Newton
至少500,000行,每行数万个字符。对于这些行中的每一行,我都会与数据库进行交互。性能确实很重要。虽然我还没有进行基准测试,但我想知道是否有明显的答案,即哪些方法基于它们的工作方式更快或更慢。 - user1136342
很可能是本地的。 - user1136342
4
我的直觉告诉我,文件读取部分不会成为你的问题。真正的问题在于你能否将文件放入内存中,并且如果可以,如何高效地处理它。我猜测你的程序大部分时间都会花在解析文件上,因此如果你想加速,就需要在问题中提供这些细节。 - Dave S.
2个回答

5
Ruby很可能会使用相同或非常相似的低级代码(用C编写)来执行前三个选项的实际磁盘读取操作,因此它们应该表现类似。鉴于此,您应该选择最方便的选项;这就是像Ruby这样的语言如此有用的原因!您将从磁盘中读取大量数据,因此建议使用each_line并在读取每行时处理每行数据。
我不建议引入grepsed或任何其他外部工具,除非您有非常好的理由,因为它们会使您的代码不太可移植,并且会让您暴露于可能难以诊断的故障中。

3
如果您正在使用Ruby,那么无需担心性能。该语言适合迭代式地逐行读取文件,并且非常适合。只要您按照设计方式使用语言,就可以让解释器处理性能问题。任务完成。
如果确实需要一个特定的readLargeFileFast方法,那么应该是因为它真正妨碍了程序。现在,您可以编写一个C程序来执行它,并在Ruby代码中作为单独的进程使用popen。您可以将其命名为read_large.c,并(也许)使用命令行参数告诉它如何行事。
这是支持使用脚本语言进行快速开发而不是快速运行时的理念。因此,开发人员可以通过在类似Ruby的东西中快速“原型”程序,然后仅在必要时重写某些低级代码来提高生产力。然而,通常一旦脚本工作正常,就没有必要再做其他任何事情。

Ruby文档 描述了启动一个单独的进程并将其视为文件的过程,非常容易!一篇好的起步文章是《Linux编程的艺术》关于程序模块化的介绍段落。本书还提供了一个使用Linux标准流编辑器sed的很好的示例,你现在就可以从Ruby中使用它。

如果你需要解析或编辑大量文本,则许多解释器或编辑器围绕sed的功能编写了代码。此外,如果你不了解C语言,使用它可能会节省你大量的工作时间并获得高效率的结果。Bruce Barnett的SED入门教程 是个不错的选择。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接