Enumerator を使用して、ファイルのチャンクを遅延読み込みします。
CHUNK_SIZE = 1024 # adjust to best fit the size of your matching regex
def file_overlapping_chunks filename
Enumerator.new do |yielder|
pos = 0
while pos < File.size(filename)
data = File.open(filename,'r') { |f| f.seek(pos); f.read(CHUNK_SIZE) }
yielder.yield(data)
pos += (CHUNK_SIZE / 2) # adjust to best fit size of your matching regex
end
end
end
chunker = file_overlapping_chunks('my_big_file')
chunker.find { |chunk| chunk =~ /xyz/ }
列挙子を使用すると、ファイルの一部を遅延読み込みできます。ファイル チャンクは重複しているため、一致するデータがチャンクの境界に落ちて見落とされることはありません。私が(ずさんに)実装したため、ファイルは開いたままにされないため、使用するために open() または close() は必要ありません。これも最速の方法ではありませんが、使い方は簡単です。ファイル名を指定して呼び出し、提供された列挙子を使用するだけです。