Память ошибок кучи Java выходит за границы при чтении CSV-файлов - PullRequest
0 голосов
/ 27 января 2019

У меня есть 700 CSV-файлов каждый размером около 5-7 МБ. Я использую Spring boot. Все, что мне нужно сделать, это прочитать эти 700 CSV-файлов. Поэтому, когда в каталог добавляется новый файл, вызывается метод fileUpdatedOrAdded() из FileWatcherJob.java. Он делает некоторые проверки и просто пытается прочитать файлы по существу.

FileWatcherJob.java

public class FileWatcherJob implements DirectoryScanListener {

    private final static Logger logger = LoggerFactory.getLogger(FileWatcherJob.class);

    public static final String LISTENER_NAME = "DirScanListenerName";

    private static boolean fileFound = true;

    private ReadFile readFile = new ReadFile();

    public void filesUpdatedOrAdded(File[] files) {
        if (fileFound) {

            System.out.println("------------- I am doing it again-------------");
            for (File file : files) {
                logger.info("File Found : {}", file.getName());
            }
            logger.info("ALL THE FILES ARE AVAILABLE NOW");

            if (!readFile.getFileAStored()) {
                readFile.readAllFiles("D:\\FileToRead\\fileA.csv");
            }

            if (!readFile.getFileBStored()) {
                readFile.readAllFiles("D:\\FileToRead\\fileB.csv");
            }

            //Read Miscallenous Files including File A and File B
            if (readFile.getFileAStored() && readFile.getFileBStored()) {
                readFile.readAllFiles("D:\\FileToRead\\");
            }
            fileFound = false;
            logger.info("-------------- I am done -----------------");
        }
    }
}

ReadFile.java

public class ReadFile {

    private static final Logger LOGGER = LoggerFactory.getLogger(ReadFile.class);


    private Map<Path, List<String>> fileA = new HashMap<>();
    private Map<Path, List<String>> fileB = new HashMap<>();
    private Boolean fileAStored = false;
    private Boolean fileBStored = false;

    private Map<Path, List<String>> miscallenousFiles = new HashMap<>();

    public Boolean getFileAStored() {
        return fileAStored;
    }

    public Boolean getFileBStored() {
        return fileBStored;
    }

    public void readAllFiles(String path) {

        try (Stream<Path> paths = Files.walk(Paths.get(path)).collect(toList()).parallelStream()
        ){
            paths.forEach(filePath -> {
                //LOGGER.info("CHECK IF FILE IS REGULAR");
                if (filePath.toFile().exists()) {

                    String fileName = filePath.getFileName().toString();
                    try {
                            LOGGER.info("START LOADING THE CONTENT OF FILE " + fileName);
                            List<String> loadedFile = readContent(filePath);
                            storeAandBFiles(fileName, filePath, loadedFile);
                    } catch (Exception e) {
                        LOGGER.info("ERROR WHILE READING THE CONTENT OF FILE");
                        LOGGER.error(e.getMessage());
                    }
                }
            });
        } catch (IOException e) {
            LOGGER.info("ERROR WHILE READING THE FILES IN PARALLEL");
            LOGGER.error(e.getMessage());
        }
    }


    private List<String> readContent(Path filePath) throws IOException {
        //LOGGER.info("START READING THE FILE, LINE BY LINE");
        return Files.readAllLines(filePath, StandardCharsets.ISO_8859_1);
    }

    private void storeAandBFiles(String fileName, Path filePath, List<String> loadedFile) {
        //LOGGER.info("START STORING THE FILE");
        if (fileName.contains("fileA") && !fileAStored) {
            fileA.put(filePath.getFileName(), loadedFile);
            fileAStored = true;
        }

        if (fileName.contains("fileB") && !fileBStored) {
            fileB.put(filePath.getFileName(), loadedFile);
            fileBStored = true;
        }

    }
}

Я продолжаю получать ошибку ниже:

Задание group1.FileScanJobName выдало необработанное исключение:

java.lang.OutOfMemoryError: пространство кучи Java

Я не понимаю, в чем проблема. Может кто-нибудь, пожалуйста, помогите? Одна странная вещь, и я подозреваю причину проблемы в том, что даже когда в каталог не добавляется новый файл, наблюдатель все равно почему-то говорит, что в каталоге обнаружен новый файл!

...