diff --git a/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/FileLineListReader.java b/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/FileLineListReader.java
new file mode 100644
index 0000000000000000000000000000000000000000..c2d9f1d960760992ccaf7014289f98cc088ad649
--- /dev/null
+++ b/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/FileLineListReader.java
@@ -0,0 +1,36 @@
+package com.oracle.truffle.r.test.packages.analyzer;
+
+import java.io.IOException;
+import java.util.Iterator;
+import java.util.List;
+
+public class FileLineListReader extends FileLineReader {
+
+    private final Iterator<String> it;
+    private final boolean empty;
+
+    public FileLineListReader(List<String> lines) {
+        Iterator<String> iterator = lines.iterator();
+        this.it = iterator;
+        this.empty = iterator.hasNext();
+    }
+
+    @Override
+    public String readLine() throws IOException {
+        if (!it.hasNext()) {
+            return null;
+        }
+        return it.next();
+    }
+
+    @Override
+    public boolean isEmpty() {
+        return empty;
+    }
+
+    @Override
+    public Iterator<String> iterator() {
+        return it;
+    }
+
+}
diff --git a/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/FileLineReader.java b/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/FileLineReader.java
new file mode 100644
index 0000000000000000000000000000000000000000..4d3301e9996d53aad8a8e845eee165510095862f
--- /dev/null
+++ b/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/FileLineReader.java
@@ -0,0 +1,42 @@
+package com.oracle.truffle.r.test.packages.analyzer;
+
+import java.io.IOException;
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+
+public abstract class FileLineReader implements Iterable<String> {
+
+    public abstract String readLine() throws IOException;
+
+    public abstract boolean isEmpty();
+
+    @Override
+    public Iterator<String> iterator() {
+        return new Iterator<String>() {
+
+            private String line = null;
+
+            @Override
+            public boolean hasNext() {
+                try {
+                    if (line == null) {
+                        line = readLine();
+                    }
+                    return line != null;
+                } catch (IOException e) {
+                    // ignore
+                }
+                return false;
+            }
+
+            @Override
+            public String next() {
+                if (hasNext()) {
+                    return line;
+                }
+                throw new NoSuchElementException();
+            }
+        };
+    }
+
+}
diff --git a/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/FileLineStreamReader.java b/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/FileLineStreamReader.java
new file mode 100644
index 0000000000000000000000000000000000000000..fec19a56cb461c8aa4ad4adec42909a041bb18ac
--- /dev/null
+++ b/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/FileLineStreamReader.java
@@ -0,0 +1,33 @@
+package com.oracle.truffle.r.test.packages.analyzer;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+
+public class FileLineStreamReader extends FileLineReader {
+    /** Maximum number of lines that will be analyzed. */
+    public static final int MAX_LINES = 50000;
+
+    private final BufferedReader reader;
+    private int cnt = 0;
+
+    public FileLineStreamReader(BufferedReader in) {
+        this.reader = in;
+    }
+
+    @Override
+    public String readLine() throws IOException {
+        if (cnt++ >= MAX_LINES) {
+            throw new IOException("File is too large for analysis.");
+        }
+        return reader.readLine();
+    }
+
+    @Override
+    public boolean isEmpty() {
+        try {
+            return reader.ready();
+        } catch (IOException e) {
+            return false;
+        }
+    }
+}
diff --git a/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/detectors/ConfigureErrorDetector.java b/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/detectors/ConfigureErrorDetector.java
index 008b48d83c91a50d2d99207db82de7a64e9bf304..324fa59d33fac1628784716f48f032b0f5636d6d 100644
--- a/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/detectors/ConfigureErrorDetector.java
+++ b/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/detectors/ConfigureErrorDetector.java
@@ -24,8 +24,8 @@ package com.oracle.truffle.r.test.packages.analyzer.detectors;
 
 import java.util.Collection;
 import java.util.LinkedList;
-import java.util.List;
 
+import com.oracle.truffle.r.test.packages.analyzer.FileLineReader;
 import com.oracle.truffle.r.test.packages.analyzer.Location;
 import com.oracle.truffle.r.test.packages.analyzer.Problem;
 import com.oracle.truffle.r.test.packages.analyzer.model.RPackageTestRun;
@@ -45,7 +45,7 @@ public class ConfigureErrorDetector extends LineDetector {
     }
 
     @Override
-    public Collection<Problem> detect(RPackageTestRun pkgTestRun, Location startLocation, List<String> body) {
+    public Collection<Problem> detect(RPackageTestRun pkgTestRun, Location startLocation, FileLineReader body) {
         Collection<Problem> problems = new LinkedList<>();
         assert body.isEmpty() || startLocation != null;
         int lineNr = startLocation != null ? startLocation.lineNr : 0;
diff --git a/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/detectors/Detector.java b/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/detectors/Detector.java
index b71512b5e51415511a5add23996e8ed1c71343a0..c31440649cba71515cdc2b3320fb2bd790d327f7 100644
--- a/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/detectors/Detector.java
+++ b/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/detectors/Detector.java
@@ -22,6 +22,7 @@
  */
 package com.oracle.truffle.r.test.packages.analyzer.detectors;
 
+import java.io.IOException;
 import java.util.Collection;
 import java.util.LinkedList;
 
@@ -60,6 +61,6 @@ public abstract class Detector<T> {
      * @param body The content to analyze (e.g. a list of lines in a file).
      * @return A list of detected problems (must not be {@code null}).
      */
-    public abstract Collection<Problem> detect(RPackageTestRun pkgTestRun, Location startLineLocation, T body);
+    public abstract Collection<Problem> detect(RPackageTestRun pkgTestRun, Location startLineLocation, T body) throws IOException;
 
 }
diff --git a/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/detectors/InstallationProblemDetector.java b/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/detectors/InstallationProblemDetector.java
index b63d31b1d5a274a6fcc4bee78685afc50b058885..d975a8a359080371bf40d8ae8b7725e2d2bef31b 100644
--- a/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/detectors/InstallationProblemDetector.java
+++ b/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/detectors/InstallationProblemDetector.java
@@ -24,10 +24,10 @@ package com.oracle.truffle.r.test.packages.analyzer.detectors;
 
 import java.util.Collection;
 import java.util.Collections;
-import java.util.List;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
+import com.oracle.truffle.r.test.packages.analyzer.FileLineReader;
 import com.oracle.truffle.r.test.packages.analyzer.Location;
 import com.oracle.truffle.r.test.packages.analyzer.Problem;
 import com.oracle.truffle.r.test.packages.analyzer.model.RPackageTestRun;
@@ -47,7 +47,7 @@ public class InstallationProblemDetector extends LineDetector {
     }
 
     @Override
-    public Collection<Problem> detect(RPackageTestRun pkg, Location startLocation, List<String> body) {
+    public Collection<Problem> detect(RPackageTestRun pkg, Location startLocation, FileLineReader body) {
         int lineNr = startLocation.lineNr;
         for (String line : body) {
             Matcher matcher = pattern.matcher(line);
diff --git a/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/detectors/LineDetector.java b/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/detectors/LineDetector.java
index a035f5eb1be6b1c0e38f41c051f60c5423894fc0..ac8f8610414280000a641b54672a0664d460312f 100644
--- a/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/detectors/LineDetector.java
+++ b/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/detectors/LineDetector.java
@@ -22,9 +22,9 @@
  */
 package com.oracle.truffle.r.test.packages.analyzer.detectors;
 
-import java.util.List;
+import com.oracle.truffle.r.test.packages.analyzer.FileLineReader;
 
-public abstract class LineDetector extends Detector<List<String>> {
+public abstract class LineDetector extends Detector<FileLineReader> {
 
     protected LineDetector() {
         super(null);
diff --git a/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/detectors/RErrorDetector.java b/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/detectors/RErrorDetector.java
index 6f304037442499e61d0c18c2ed1673139cc08996..1a586f6eed723694f11b41398f7de8e3efc4e712 100644
--- a/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/detectors/RErrorDetector.java
+++ b/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/detectors/RErrorDetector.java
@@ -25,10 +25,10 @@ package com.oracle.truffle.r.test.packages.analyzer.detectors;
 import java.util.Collection;
 import java.util.Iterator;
 import java.util.LinkedList;
-import java.util.List;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
+import com.oracle.truffle.r.test.packages.analyzer.FileLineReader;
 import com.oracle.truffle.r.test.packages.analyzer.Location;
 import com.oracle.truffle.r.test.packages.analyzer.Problem;
 import com.oracle.truffle.r.test.packages.analyzer.model.RPackageTestRun;
@@ -48,7 +48,7 @@ public class RErrorDetector extends LineDetector {
     }
 
     @Override
-    public Collection<Problem> detect(RPackageTestRun pkg, Location startLocation, List<String> body) {
+    public Collection<Problem> detect(RPackageTestRun pkg, Location startLocation, FileLineReader body) {
 
         Collection<Problem> problems = new LinkedList<>();
         assert body.isEmpty() || startLocation != null;
diff --git a/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/detectors/RInternalErrorDetector.java b/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/detectors/RInternalErrorDetector.java
index 56b5e78cedd8a748cc08ebf527e7f1632dedea1d..6283bc19d5cf83a8d093988c69b0ca2eb7a50fa0 100644
--- a/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/detectors/RInternalErrorDetector.java
+++ b/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/detectors/RInternalErrorDetector.java
@@ -22,10 +22,11 @@
  */
 package com.oracle.truffle.r.test.packages.analyzer.detectors;
 
+import java.io.IOException;
 import java.util.Collection;
 import java.util.LinkedList;
-import java.util.List;
 
+import com.oracle.truffle.r.test.packages.analyzer.FileLineReader;
 import com.oracle.truffle.r.test.packages.analyzer.Location;
 import com.oracle.truffle.r.test.packages.analyzer.Problem;
 import com.oracle.truffle.r.test.packages.analyzer.model.RPackageTestRun;
@@ -46,11 +47,11 @@ public class RInternalErrorDetector extends LineDetector {
     }
 
     @Override
-    public Collection<Problem> detect(RPackageTestRun pkg, Location startLocation, List<String> body) {
+    public Collection<Problem> detect(RPackageTestRun pkg, Location startLocation, FileLineReader body) throws IOException {
         Collection<Problem> problems = new LinkedList<>();
-        assert body.isEmpty() || startLocation != null;
         int lineNr = startLocation != null ? startLocation.lineNr : 0;
-        for (String line : body) {
+        String line = null;
+        while ((line = body.readLine()) != null) {
             int indexOf = line.indexOf(P);
             if (indexOf != -1) {
                 String message = line.substring(indexOf + P.length());
diff --git a/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/detectors/SegfaultDetector.java b/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/detectors/SegfaultDetector.java
index f23d7933a922ec8d504301440eaf8c36fcc8a9d7..0c601f37f252b59979f74febc933c0fa9da55ce3 100644
--- a/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/detectors/SegfaultDetector.java
+++ b/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/detectors/SegfaultDetector.java
@@ -24,8 +24,8 @@ package com.oracle.truffle.r.test.packages.analyzer.detectors;
 
 import java.util.Collection;
 import java.util.Collections;
-import java.util.List;
 
+import com.oracle.truffle.r.test.packages.analyzer.FileLineReader;
 import com.oracle.truffle.r.test.packages.analyzer.Location;
 import com.oracle.truffle.r.test.packages.analyzer.Problem;
 import com.oracle.truffle.r.test.packages.analyzer.model.RPackageTestRun;
@@ -44,7 +44,7 @@ public class SegfaultDetector extends LineDetector {
     }
 
     @Override
-    public Collection<Problem> detect(RPackageTestRun pkg, Location startLocation, List<String> body) {
+    public Collection<Problem> detect(RPackageTestRun pkg, Location startLocation, FileLineReader body) {
         StringBuilder segfaultMessage = new StringBuilder();
         boolean collect = false;
         assert body.isEmpty() || startLocation != null;
diff --git a/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/detectors/SymbolLookupErrorDetector.java b/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/detectors/SymbolLookupErrorDetector.java
index bd218894e024d78ada9a40a34694e06cf24f472c..4676780e54482e8a526a42bbb4c53a032920dc6d 100644
--- a/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/detectors/SymbolLookupErrorDetector.java
+++ b/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/detectors/SymbolLookupErrorDetector.java
@@ -24,10 +24,10 @@ package com.oracle.truffle.r.test.packages.analyzer.detectors;
 
 import java.util.Collection;
 import java.util.LinkedList;
-import java.util.List;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
+import com.oracle.truffle.r.test.packages.analyzer.FileLineReader;
 import com.oracle.truffle.r.test.packages.analyzer.Location;
 import com.oracle.truffle.r.test.packages.analyzer.Problem;
 import com.oracle.truffle.r.test.packages.analyzer.model.RPackageTestRun;
@@ -47,7 +47,7 @@ public final class SymbolLookupErrorDetector extends LineDetector {
     }
 
     @Override
-    public Collection<Problem> detect(RPackageTestRun pkgTestRun, Location startLocation, List<String> body) {
+    public Collection<Problem> detect(RPackageTestRun pkgTestRun, Location startLocation, FileLineReader body) {
         Collection<Problem> problems = new LinkedList<>();
         int lineNr = startLocation != null ? startLocation.lineNr : 0;
         for (String line : body) {
diff --git a/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/detectors/UnsupportedSpecializationDetector.java b/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/detectors/UnsupportedSpecializationDetector.java
index 99f270940e23845ce25a4c3b260b9f278ca748d4..260e7a09cb992670a7778797997e245285caacc6 100644
--- a/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/detectors/UnsupportedSpecializationDetector.java
+++ b/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/detectors/UnsupportedSpecializationDetector.java
@@ -24,10 +24,10 @@ package com.oracle.truffle.r.test.packages.analyzer.detectors;
 
 import java.util.Collection;
 import java.util.LinkedList;
-import java.util.List;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
+import com.oracle.truffle.r.test.packages.analyzer.FileLineReader;
 import com.oracle.truffle.r.test.packages.analyzer.Location;
 import com.oracle.truffle.r.test.packages.analyzer.Problem;
 import com.oracle.truffle.r.test.packages.analyzer.model.RPackageTestRun;
@@ -49,7 +49,7 @@ public class UnsupportedSpecializationDetector extends LineDetector {
     }
 
     @Override
-    public Collection<Problem> detect(RPackageTestRun pkg, Location startLocation, List<String> body) {
+    public Collection<Problem> detect(RPackageTestRun pkg, Location startLocation, FileLineReader body) {
         Collection<Problem> problems = new LinkedList<>();
         String message = null;
         assert body.isEmpty() || startLocation != null;
diff --git a/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/parser/LogFileParser.java b/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/parser/LogFileParser.java
index 57ddf81a2a6854017b216ab563a46937a7fa2df2..7e93063debd34c9e46bd6deb7be6862766144715 100644
--- a/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/parser/LogFileParser.java
+++ b/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/parser/LogFileParser.java
@@ -27,12 +27,12 @@ import java.io.IOException;
 import java.nio.file.FileVisitResult;
 import java.nio.file.FileVisitor;
 import java.nio.file.Files;
-import java.nio.file.NoSuchFileException;
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.nio.file.attribute.BasicFileAttributes;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.LinkedList;
@@ -46,6 +46,9 @@ import java.util.logging.Logger;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
+import com.oracle.truffle.r.test.packages.analyzer.FileLineListReader;
+import com.oracle.truffle.r.test.packages.analyzer.FileLineReader;
+import com.oracle.truffle.r.test.packages.analyzer.FileLineStreamReader;
 import com.oracle.truffle.r.test.packages.analyzer.Location;
 import com.oracle.truffle.r.test.packages.analyzer.Problem;
 import com.oracle.truffle.r.test.packages.analyzer.detectors.Detector;
@@ -176,18 +179,23 @@ public class LogFileParser {
 
                 if (Files.isReadable(outputFile)) {
                     ignoreFiles.add(outputFile);
-                    checkResults.problems.addAll(applyDetectors(Token.OUTPUT_MISMATCH_FASTR, outputFile, 0, Files.readAllLines(outputFile)));
+                    try (BufferedReader in = Files.newBufferedReader(outputFile)) {
+                        checkResults.problems.addAll(applyDetectors(Token.OUTPUT_MISMATCH_FASTR, outputFile, 0, new FileLineStreamReader(in)));
+                    } catch (IOException e) {
+                        // silently ignore
+                    }
                 } else {
                     // try to find the file anywhere in the test run directory (there were some
                     // cases)
                     Optional<Path> findFirst = null;
-                    try {
-                        findFirst = Files.find(logFile.path.getParent(), 3, (path, attr) -> path.getFileName().equals(outputFile.getFileName())).findFirst();
+                    findFirst = Files.find(logFile.path.getParent(), 3, (path, attr) -> path.getFileName().equals(outputFile.getFileName())).findFirst();
+                    try (BufferedReader in = Files.newBufferedReader(findFirst.get())) {
                         if (findFirst.isPresent()) {
                             ignoreFiles.add(findFirst.get());
-                            checkResults.problems.addAll(applyDetectors(Token.OUTPUT_MISMATCH_FASTR, findFirst.get(), 0, Files.readAllLines(findFirst.get())));
+                            checkResults.problems.addAll(applyDetectors(Token.OUTPUT_MISMATCH_FASTR, findFirst.get(), 0, new FileLineStreamReader(in)));
                         }
-                    } catch (NoSuchFileException e) {
+                    } catch (IOException e) {
+                        // silently ignore
                     }
                     if (findFirst == null || !findFirst.isPresent()) {
                         LOGGER.warning("Cannot read output file " + outputFile);
@@ -198,8 +206,10 @@ public class LogFileParser {
                 }
 
                 checkResults.setSuccess(false);
-            } else {
+            } else if (laMatches(Token.END_CHECKING)) {
                 break;
+            } else {
+                consumeLine();
             }
         }
 
@@ -304,11 +314,15 @@ public class LogFileParser {
                     // apply detectors to diff chunks
                     testing.problems.addAll(applyTestResultDetectors(diffResult));
                     diffResult.stream().forEach(chunk -> {
-                        if (!chunk.getLeft().isEmpty()) {
-                            testing.problems.addAll(applyDetectors(Token.RUNNING_SPECIFIC_TESTS, chunk.getLeftFile(), chunk.getLeftStartLine(), chunk.getLeft()));
-                        }
-                        if (!chunk.getRight().isEmpty()) {
-                            testing.problems.addAll(applyDetectors(Token.RUNNING_SPECIFIC_TESTS, chunk.getRightFile(), chunk.getRightStartLine(), chunk.getRight()));
+                        try {
+                            if (!chunk.getLeft().isEmpty()) {
+                                testing.problems.addAll(applyDetectors(Token.RUNNING_SPECIFIC_TESTS, chunk.getLeftFile(), chunk.getLeftStartLine(), new FileLineListReader(chunk.getLeft())));
+                            }
+                            if (!chunk.getRight().isEmpty()) {
+                                testing.problems.addAll(applyDetectors(Token.RUNNING_SPECIFIC_TESTS, chunk.getRightFile(), chunk.getRightStartLine(), new FileLineListReader(chunk.getRight())));
+                            }
+                        } catch (IOException e) {
+                            // ignore, since this won't happen here
                         }
                     });
 
@@ -423,7 +437,11 @@ public class LogFileParser {
             @Override
             public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
                 if (endsWith(file, ".Rout", ".fail") && includeCheck.test(file)) {
-                    outputCheck.problems.addAll(applyDetectors(Token.BEGIN_CHECKING, file, 0, Files.readAllLines(file)));
+                    try (BufferedReader in = Files.newBufferedReader(file)) {
+                        outputCheck.problems.addAll(applyDetectors(Token.BEGIN_CHECKING, file, 0, new FileLineStreamReader(in)));
+                    } catch (IOException e) {
+                        LOGGER.severe(String.format("Error analyzing output file %s: %s", file, e.getMessage()));
+                    }
                 }
                 return FileVisitResult.CONTINUE;
             }
@@ -450,16 +468,16 @@ public class LogFileParser {
         });
     }
 
-    private Collection<Problem> applyDetectors(Token start, Path file, List<Line> body) {
+    private Collection<Problem> applyDetectors(Token start, Path file, List<Line> body) throws IOException {
         if (!body.isEmpty()) {
             Line firstLine = body.get(0);
             List<String> strBody = body.stream().map(l -> l.text).collect(Collectors.toList());
-            return applyDetectors(start, file, firstLine.lineNr, strBody);
+            return applyDetectors(start, file, firstLine.lineNr, new FileLineListReader(strBody));
         }
         return new LinkedList<>();
     }
 
-    private Collection<Problem> applyDetectors(Token start, Path file, int startLineNr, List<String> body) {
+    private Collection<Problem> applyDetectors(Token start, Path file, int startLineNr, FileLineReader body) throws IOException {
         assert Files.isRegularFile(file);
         Location startLocation = null;
         if (!body.isEmpty()) {
@@ -487,7 +505,14 @@ public class LogFileParser {
     }
 
     private Collection<Problem> applyTestResultDetectors(List<DiffChunk> diffChunk) {
-        return testResultDetectors.stream().map(detector -> detector.detect(pkg, null, diffChunk)).flatMap(l -> l.stream()).collect(Collectors.toList());
+        return testResultDetectors.stream().map(detector -> {
+            try {
+                return detector.detect(pkg, null, diffChunk);
+            } catch (IOException e) {
+                // just abort, won't happen here
+            }
+            return Collections.<Problem> emptyList();
+        }).flatMap(l -> l.stream()).collect(Collectors.toList());
     }
 
     /**
diff --git a/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/test/RErrorDetectorTest.java b/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/test/RErrorDetectorTest.java
index 9e295bb54b43f612cd0829ff2e1cc3c27be58587..e404e94230451d3c976ce9abb22751a0e0c3ae75 100644
--- a/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/test/RErrorDetectorTest.java
+++ b/com.oracle.truffle.r.test.packages.analyzer/src/com/oracle/truffle/r/test/packages/analyzer/test/RErrorDetectorTest.java
@@ -26,12 +26,12 @@ import java.nio.file.Paths;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
-import java.util.List;
 import java.util.Optional;
 
 import org.junit.Assert;
 import org.junit.Test;
 
+import com.oracle.truffle.r.test.packages.analyzer.FileLineListReader;
 import com.oracle.truffle.r.test.packages.analyzer.Location;
 import com.oracle.truffle.r.test.packages.analyzer.Problem;
 import com.oracle.truffle.r.test.packages.analyzer.detectors.RErrorDetector;
@@ -51,8 +51,8 @@ public class RErrorDetectorTest {
 
     @Test
     public void testMultiLine() {
-        List<String> lines = Arrays.asList(new String[]{"Error in check(options) : ",
-                        "ERROR: installing Rd objects failed for package ‘RUnit’"});
+        FileLineListReader lines = new FileLineListReader(Arrays.asList(new String[]{"Error in check(options) : ",
+                        "ERROR: installing Rd objects failed for package ‘RUnit’"}));
 
         Collection<Problem> detect = RErrorDetector.INSTANCE.detect(pkgTestRun, loc(), lines);
         Assert.assertEquals(1, detect.size());
@@ -65,7 +65,7 @@ public class RErrorDetectorTest {
 
     @Test
     public void testSingleLine0() {
-        List<String> lines = Collections.singletonList("Error in check(options) : invalid value for 'label' ");
+        FileLineListReader lines = new FileLineListReader(Collections.singletonList("Error in check(options) : invalid value for 'label' "));
 
         Collection<Problem> detect = RErrorDetector.INSTANCE.detect(pkgTestRun, loc(), lines);
         Assert.assertEquals(1, detect.size());
@@ -78,7 +78,7 @@ public class RErrorDetectorTest {
 
     @Test
     public void testSingleLine1() {
-        List<String> lines = Collections.singletonList("Error in check : invalid value for 'label' ");
+        FileLineListReader lines = new FileLineListReader(Collections.singletonList("Error in check : invalid value for 'label' "));
 
         Collection<Problem> detect = RErrorDetector.INSTANCE.detect(pkgTestRun, loc(), lines);
         Assert.assertEquals(1, detect.size());
@@ -91,7 +91,7 @@ public class RErrorDetectorTest {
 
     @Test
     public void testSingleLineMultipleColon() {
-        List<String> lines = Collections.singletonList("Error in check(options) : invalid value for 'label' : ");
+        FileLineListReader lines = new FileLineListReader(Collections.singletonList("Error in check(options) : invalid value for 'label' : "));
 
         Collection<Problem> detect = RErrorDetector.INSTANCE.detect(pkgTestRun, loc(), lines);
         Assert.assertEquals(1, detect.size());
@@ -104,7 +104,7 @@ public class RErrorDetectorTest {
 
     @Test
     public void testSingleLineWithoutCallstring0() {
-        List<String> lines = Collections.singletonList("Error: invalid value for 'label' ");
+        FileLineListReader lines = new FileLineListReader(Collections.singletonList("Error: invalid value for 'label' "));
 
         Collection<Problem> detect = RErrorDetector.INSTANCE.detect(pkgTestRun, loc(), lines);
         Assert.assertEquals(1, detect.size());
@@ -117,7 +117,7 @@ public class RErrorDetectorTest {
 
     @Test
     public void testSingleLineWithoutCallstring1() {
-        List<String> lines = Collections.singletonList("Error: invalid value for 'label' : ");
+        FileLineListReader lines = new FileLineListReader(Collections.singletonList("Error: invalid value for 'label' : "));
 
         Collection<Problem> detect = RErrorDetector.INSTANCE.detect(pkgTestRun, loc(), lines);
         Assert.assertEquals(1, detect.size());
@@ -129,7 +129,7 @@ public class RErrorDetectorTest {
 
     @Test
     public void testRInternalError0() {
-        List<String> lines = Collections.singletonList("RInternalError: invalid value for 'label'");
+        FileLineListReader lines = new FileLineListReader(Collections.singletonList("RInternalError: invalid value for 'label'"));
 
         Collection<Problem> detect = RErrorDetector.INSTANCE.detect(pkgTestRun, loc(), lines);
         Assert.assertEquals(0, detect.size());
@@ -137,7 +137,7 @@ public class RErrorDetectorTest {
 
     @Test
     public void testRInternalError1() {
-        List<String> lines = Collections.singletonList("> RInternalError: invalid value for 'label'");
+        FileLineListReader lines = new FileLineListReader(Collections.singletonList("> RInternalError: invalid value for 'label'"));
 
         Collection<Problem> detect = RErrorDetector.INSTANCE.detect(pkgTestRun, loc(), lines);
         Assert.assertEquals(0, detect.size());
@@ -145,7 +145,7 @@ public class RErrorDetectorTest {
 
     @Test
     public void testRInternalError2() {
-        List<String> lines = Collections.singletonList("  RInternalError: invalid value for 'label'");
+        FileLineListReader lines = new FileLineListReader(Collections.singletonList("  RInternalError: invalid value for 'label'"));
 
         Collection<Problem> detect = RErrorDetector.INSTANCE.detect(pkgTestRun, loc(), lines);
         Assert.assertEquals(0, detect.size());
@@ -153,7 +153,7 @@ public class RErrorDetectorTest {
 
     @Test
     public void testWithLinePrefix() {
-        List<String> lines = Collections.singletonList("> Error: invalid value for 'label'");
+        FileLineListReader lines = new FileLineListReader(Collections.singletonList("> Error: invalid value for 'label'"));
 
         Collection<Problem> detect = RErrorDetector.INSTANCE.detect(pkgTestRun, loc(), lines);
         Assert.assertEquals(1, detect.size());
@@ -165,8 +165,8 @@ public class RErrorDetectorTest {
 
     @Test
     public void testCallstringWithNamesAndValues0() {
-        List<String> lines = Arrays.asList(new String[]{"Error in grep(pattern, all.names, value = TRUE) : ",
-                        "  invalid regular expression '*': Dangling meta character '*' near index 0"});
+        FileLineListReader lines = new FileLineListReader(Arrays.asList(new String[]{"Error in grep(pattern, all.names, value = TRUE) : ",
+                        "  invalid regular expression '*': Dangling meta character '*' near index 0"}));
 
         Collection<Problem> detect = RErrorDetector.INSTANCE.detect(pkgTestRun, loc(), lines);
         Assert.assertEquals(1, detect.size());
@@ -178,8 +178,8 @@ public class RErrorDetectorTest {
 
     @Test
     public void testCallstringWithNamesAndValues1() {
-        List<String> lines = Arrays.asList(new String[]{"Error in grep(pattern, all.names, value = \":\") : ",
-                        "  invalid regular expression '*': Dangling meta character '*' near index 0"});
+        FileLineListReader lines = new FileLineListReader(Arrays.asList(new String[]{"Error in grep(pattern, all.names, value = \":\") : ",
+                        "  invalid regular expression '*': Dangling meta character '*' near index 0"}));
 
         Collection<Problem> detect = RErrorDetector.INSTANCE.detect(pkgTestRun, loc(), lines);
         Assert.assertEquals(1, detect.size());