4
我需要用正則表達式掃描一個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
或者只是通過一定數量的行讀取,比如說20.當您找到匹配項時,清除匹配結束並追加另外20行。不需要計算頻繁發生的'X'。 – Ranty
@Ranty很好的建議。 – DhruvPathak