我需要用正则表达式扫描一个 300MB 的文本文件。
- 读取整个文件并将其放入变量中会占用超过 700MB 的 RAM,然后因“无法分配内存”错误而失败。
- 匹配可以是两行或三行,所以我不能在循环中使用行到行步进。
是否有任何惰性方法可以使用正则表达式进行完整文件扫描而不将其读入单独的变量?
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