如何在循环中处理大文件作为另一个文件的输入

时间:2016-08-19 17:02:46

标签: ruby

我有一个超过1M行的大文件,另一个文件有我需要用来在大文件中匹配行的输入字符串。

我能够这样做:

File.open(strings_file, 'r') do |l|
  File.open(large_file, 'r') do |line|
    next if !line.include?(l)
    puts line
  end
end

但是,它将为每个循环打开大文件。例如,在输入字符串中,我有100行字符串,所以当它执行时会打开那个大文件100次来处理它,这需要更多的时间来完成。

有没有更快的方法来避免打开大文件100次?

1 个答案:

答案 0 :(得分:5)

首先,如果你弄错了,你会遇到几何缩放问题。如果输入文件A有N行而B有M行,那么你需要进行N * M测试来检查重叠。这可能是非常缓慢的。

相反,拉入输入线并将它们粘贴在可用于快速查找的内容中:

require 'set'
match_lines = Set.new(File.readlines(strings_file).map(&:chomp))

然后你可以在这里快速测试:

File.foreach(large_file) do |line|
  print line if (match_lines.include?(line.chomp))
end

我在这里使用chomp以避免匹配,如果匹配文件中的最后一行最后没有换行符,或者你在一个中使用CRLF编码而在另一个中使用LF