正規表現を使用して300MBのテキストファイルをスキャンする必要があります。
- ファイル全体を読み取って変数に取り込むと、700MBを超えるRAMが消費され、「メモリを割り当てることができません」というエラーで失敗します。
- 一致は2行または3行である可能性があるため、行間のステップインループを使用することはできません。
別の変数に読み込まずに正規表現を使用して完全なファイルスキャンを実行するための怠惰な方法はありますか?
UPD
終わり。これで、この関数を使用してチャンクで読み取ることができます。目標に合わせて変更してください。
def prepare_session_hash(fname, regex_string, start=0)
@session_login_hash = {}
File.open(fname, 'rb') { |f|
fsize = f.size
bsize = fsize / 8
if start > 0
f.seek(start)
end
overlap = 200
while true
if (f.tell() >= overlap) and (f.tell() < fsize)
f.seek(f.tell() - overlap)
end
buffer = f.read(bsize)
if buffer
buffer.scan(s) { |match|
@session_login_hash[match[0]] = match[1]
}
else
return @session_login_hash
end
end
}
end