データベース テーブルのダンプを含む 2.6 ギガバイトのテキスト ファイルがあり、フィールドをすべて一意にできるように、それを論理構造に取り込もうとしています。これを行うために使用しているコードは次のとおりです。
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 秒以上かかります。
実際には、ファイルを切り刻んでこの問題を回避し、結果のリストと一意の -that- を組み合わせて、最終的な出力を得ることができます。
しかし、好奇心の観点からは、私は満足していません。
なぜこの一時停止が発生するのか、なぜ長くなるのか、それをエレガントに回避する方法があるのか 誰か教えてもらえますか? 本当に私はそれが何であり、なぜそれが起こるのかを知りたいだけです.なぜなら、私がそれに気づいたので、このコンピューターと他のコンピューターの両方で実行する他の多くのRubyスクリプトで見られるからです.