我有一个 2.6 GB 的文本文件,其中包含一个数据库表的转储,我试图将其拉入一个逻辑结构,以便所有字段都是唯一的。我用来执行此操作的代码在这里:
class Targetfile
include Enumerable
attr_accessor :inputfile, :headers, :input_array
def initialize(file)
@input_array = false
@inputfile = File.open(file, 'r')
@x = @inputfile.each.count
end
def get_headers
@y = 1
@inputfile.rewind
@input_array = Array.new
@headers = @inputfile.first.chomp.split(/\t/)
@inputfile.each do |line|
print "\n#{@y} / #{@x}"
@y+=1
self.assign_row(line)
end
end
def assign_row(line)
row_array = line.chomp.encode!('UTF-8', 'UTF-8', :invalid => :replace).split(/\t/)
@input_array << Hash[ @headers.zip(row_array) ]
end
def send_build
@input_array || self.get_headers
end
def each
self.send_build.each {|row| yield row}
end
end
该类已成功初始化,我留下了一个 Targetfile 类对象。
问题是,当我随后调用get_headers
将文件转换为哈希数组的方法时,它立即开始减速。
直到项目编号 80,000 左右,我的眼睛才注意到这一点,但随后很明显,文件的每 3-4,000 行,就会发生某种暂停。这种停顿,每次发生,都需要稍长一点的时间,直到第 100 万行,它需要的时间超过 30 秒。
出于实际目的,我可以将文件切碎以避免这个问题,然后结合结果列表和唯一的 - 那 - 以获得我的最终输出。
然而,从好奇心的角度来看,我并不满意。
谁能告诉我为什么会发生这种暂停,为什么会变长,以及是否有任何方法可以优雅地避免它?真的,我只是想知道它是什么以及它为什么会发生,因为现在我已经注意到它,我在我运行的许多其他 Ruby 脚本中都看到了它,无论是在这台计算机上还是在其他计算机上。