【问题标题】:What's the fastest way to read a large file in Ruby?在 Ruby 中读取大文件的最快方法是什么?
【发布时间】:2013-01-17 06:06:21
【问题描述】:

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

  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 行。

【问题讨论】:

  • 什么是“大”文件?你在用它做什么?性能真的重要吗?您是否尝试过对任何东西进行基准测试?
  • 至少 500,000 行,每行数万个字符。对于每一行,我都会对数据库做一些事情。性能确实很重要。我没有对任何东西进行基准测试,但我想知道是否有明显的答案,仅根据它们的工作方式,哪些更快或更慢。
  • 可能是本地的。
  • 我的直觉说文件读取部分不会是你的问题。真正的问题是您是否可以将文件放入内存中,如果可以,您如何有效地处理它。我的猜测是您将花费程序的大部分时间来解析文件,因此如果您想要加快速度,您可能需要使用这些详细信息更新此问题。

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


【解决方案1】:

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

我不建议将grepsed 或任何其他此类外部实用程序带入图片中,除非您有充分的理由非常,因为它们会降低您的代码的可移植性并暴露您可能会遇到难以诊断的故障。

【讨论】:

    【解决方案2】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-24
      • 2019-09-12
      • 2021-12-08
      • 2020-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多