我有一个超过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次?
答案 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