7

我已经看到了这个问题的答案,但我不知道哪个答案的执行速度最快。这些是我见过的答案-哪个最好?

  1. 使用 each 或 each_line 一次读取一行
  2. 使用gets一次读取一行
  3. 使用 readlines 将其全部保存到行数组中,然后使用每个行
  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 行。

4

2 回答 2

4

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

除非您有充分的理由,否则我不建议您将 , 或任何其他此类外部实用程序带入图片因为grep它们会使您的代码的可移植性降低,并使您面临可能难以诊断的故障。sed

于 2013-02-01T22:11:52.053 回答
2

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

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

这支持了脚本语言用于快速开发而不是快速运行的想法。因此,开发人员可以通过在 Ruby 之类的程序中快速“原型化”程序来提高生产力,并且只有在以后重写组件才能保证一些低级代码。然而,通常,一旦它在脚本中工作,就根本不需要做任何其他事情。

Ruby Docs描述了启动一个单独的进程并将其视为一个文件。这很容易!一个好的开始是 The Art of Linux Programming 关于程序模块化的介绍性段落。本书还提供了一个使用 linux 标准流编辑器(称为sed )的绝佳示例,您现在可以从 Ruby 中使用它。

如果您需要解析或编辑大量文本,那么围绕 sed 的功能编写了许多解释器或编辑器。此外,如果您不了解 C,编写一些超级高效的东西可能会为您节省很多精力。Bruce Barnett的 SED 简介很好。

于 2013-02-01T21:21:04.290 回答