Beim Parsen großer Dateien muss man in jeder Programmiersprache auf den Hauptspeicher achten. So ist es auch bei Groovy. Es ist ein Leichtes mit der Methode eachLine
und einem Closure durch eine Datei zu iterieren. Doch dafür wird die Datei komplett in den Hauptspeicher geladen. Das führt bei größeren Dateien je nach Hauptspeicherausbau des Rechners schnell zu einer Exception.
Besser ist es dann mit der Methode withReader
zu arbeiten. Das nachfolgende Code Beispiel sucht in einer Logdatei nach einem bestimmten Bereich, der mit BEGIN_SECTION beginnt und mit END_SECTION endet. Erfolgreich getestet habe ich es mit 150 MB großen awstats Logs.
def file=new File("bigData.log") def sectionData=[] def startSection=false; file.withReader{ r -> for (def line; (line = r.readLine()) != null; ) { if (line.startsWith("BEGIN_SECTION")) { startSection=true continue } if (line.startsWith("END_SECTION")) break if (startSection) { sectionData.add(line.trim().split()) } } }
Links:
stackoverflow.com Groovy: Reading a range of lines from file