我有一个非常大的 CSV 文件,大约 800,000 行。我想尝试并行处理这个文件以加快我的脚本。
如何使用 Ruby 将文件分成 n 个小块?
我有一个非常大的 CSV 文件,大约 800,000 行。我想尝试并行处理这个文件以加快我的脚本。
如何使用 Ruby 将文件分成 n 个小块?
对于 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 而不是直接打开文件。
将 CSV 文件分成块是按顺序排列的,但您必须记住,每个块都需要与 CSV-header 保持第一行!
所以 UNIX '分裂' 不会削减它!
您必须编写自己的小 Ruby 脚本,该脚本读取第一行并将其存储在变量中,然后将接下来的 N 行分发到新的部分 CSV 文件,但首先将 CSV-header 行复制到其中。ETC..
在使用标题和一大段行创建每个文件后,您可以使用 Resque 征集这些文件以供 Resque 工作人员进行并行处理。
我会使用 linux split 命令将此文件拆分为许多较小的文件。然后,将处理这些较小的部分。