0

我有一个非常大的 CSV 文件,大约 800,000 行。我想尝试并行处理这个文件以加快我的脚本。

如何使用 Ruby 将文件分成 n 个小块?

4

3 回答 3

2

对于 csv 文件,您可以这样做:

open("your_file.csv").each_line do |line|
  # do your stuff here like split lines
  line.split(",")

  # or store them in an array
  some_array << line

  # or write them back to a file
  some_file_handler << line
end

通过将行(或拆分行)存储在数组(内存)或文件中,您可以将大文件分成更小的部分。之后,可以使用线程来处理每个部分:

threads = []
1.upto(5) { |i| threads << Thread.new { do your stuff with file[i] } }

threads.each(&:join)

请注意,您有责任确保线程安全。

希望这可以帮助!

更新:

根据 pguardiario 的建议,我们可以使用stand library 中的csv 而不是直接打开文件。

于 2012-04-05T03:28:00.573 回答
2

将 CSV 文件分成块是按顺序排列的,但您必须记住,每个块都需要与 CSV-header 保持第一行!

所以 UNIX '分裂' 不会削减它!

您必须编写自己的小 Ruby 脚本,该脚本读取第一行并将其存储在变量中,然后将接下来的 N 行分发到新的部分 CSV 文件,但首先将 CSV-header 行复制到其中。ETC..

在使用标题和一大段行创建每个文件后,您可以使用 Resque 征集这些文件以供 Resque 工作人员进行并行处理。

http://railscasts.com/episodes/271-resque

于 2012-04-05T06:15:03.313 回答
0

我会使用 linux split 命令将此文件拆分为许多较小的文件。然后,将处理这些较小的部分。

于 2012-04-05T03:21:10.943 回答