【发布时间】:2012-12-28 15:58:02
【问题描述】:
我需要使用正则表达式扫描一个 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
【问题讨论】: