我需要使用正则表达式扫描 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
- 以块的形式遍历文件,而不是逐行遍历文件,其中块是由频繁出现的字符或模式(例如“X”)的出现创建的。
- “X”是这样的,它永远不会存在于你的正则表达式中,即“X”是你的正则表达式永远不会匹配字符串的地方。
- 匹配当前块中的正则表达式,提取匹配项并继续到下一个块。
Example:
This is string with multline numbers -2000
2223434
34356666
444564646
. These numbers can occur at 34345
567567 places, and on 67
87878 pages . The problem is to find a good
way to extract these more than 100
0 regexes without memory hogging.
在本文中,假设所需的模式是数字字符串,例如/d+/s
匹配多行数字,
然后,您可以选择块创建模式,而不是处理和加载整个文件,在本例中为“句号”.
并且只读取和处理直到这个模式,然后移动到下一个块。
CHUNK#1:
This is string with multline numbers -2000
2223434
34356666
444564646
.
CHUNK#2:
These numbers can occur at 34345
567567 places, and on 67
87878 pages
等等。
编辑:
还从评论中添加@Ranty的建议:
或者只是读一些行,比如 20 行。当你找到
匹配其中,清除直到匹配结束并追加另外 20 行。
无需计算频繁出现的“X”。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)