Как оптимизировать следующий код при использовании нескольких циклов for и если условия для чтения больших файлов CSV в параллельном режиме - PullRequest
0 голосов
/ 28 января 2019

У меня есть 700 CSV-файлов (из 5 МБ, 1000 строк и 600 столбцов) -> вызвать его загруженный файл.У меня есть еще 2 файла CSV, FileA (20 МБ, 3 столбца и 100 000 строк) и FileB (30 МБ, 2 столбца и 100 000 строк).

А остальные 700 файлов CSV загружаются в List<String> используя

Files.readAllLines(filePath, StandardCharsets.ISO_8859_1);

Постановка задачи:

Мне нужно проверить, существует ли для каждого загруженного файла его столбец A в столбце C FileA, если это правда, то проверить, соответствующиеСтолбец B FileA существует в столбце A FileB. Теперь, если это также верно только тогда, загрузите соответствующую строку Загруженного файла в массив байтов.

Существующий код:

public void createByteData(Path filePath, List<String> loadedFiles) {

    LOGGER.info("LOADING THE SCENARIO FILE : " + filePath);

    for (String loadedFile : loadedFiles) {
        String[] loadedFileCoulmns= loadedFile .split(",");
        String loadedFileFirstCoulmns  = loadedFileCoulmns[0];
        //LOGGER.info("LOADING THE ROW FOR SCENARIO FILE : " + filePath);
            if(readFileA.containsKey(loadedFileFirstCoulmns )) {     //readFileA is Stroing the FileA in private HashMap<String, String> , Column C in Key and Column B in Value

                    String getColumnB = constructNumtra(readFileA.get(loadedFileFirstCoulmns ));
                    if (readFileB.contains(getColumnB)) {    // readFileB is Stroing the FileB in private HashMap<String, String> , Column B in Key and Column A in Value
                        //LOGGER.info("INSTRUMENT FOUND IN PORTFOLIO NUMTRA: " + getColumnB);
                        //To Do : Convert Scenario File to Byte Array                
                    }
                }
    }
    LOGGER.info("Loading Completed for : " + filePath);
}

Также яесть роскошь использовать любую коллекцию для загрузки файлов.Я использовал Array<List> и Hashmap здесь.

Инфраструктура и технологическая информация:

  • Springboot
  • Многопоточность - загруженные файлы загружаются параллельно с использованием параллельных потоков Java 8,
  • Java 8.

Код работает отлично.Но это занимает много времени, так как у меня большие файлы CSV.

Как я могу оптимизировать эту ситуацию?

Ответы [ 2 ]

0 голосов
/ 28 января 2019

Я бы хотел использовать Stram API с поддержкой параллельной обработки.Хорошее объяснение можно найти здесь:

https://www.baeldung.com/java-8-parallel-streams-custom-threadpool

0 голосов
/ 28 января 2019

Одно прямое изменение, которое вы можете сделать, это распараллелить обработку загруженных файлов.Вызовите createByteData для каждого загруженного файла и используйте службу executor для параллельной обработки.Ниже псевдокод для того же

public void createByteData(String loadedFile) {

        // Loading one of the file out of 700 files for each row
        String[] loadedFileCoulmns = loadedFile.split(","); // Splitting the content of file to get the value of column
                                                            // 1
        String loadedFileFirstCoulmns = loadedFileCoulmns[0]; // got the value of column to compare

        for (Map.Entry<Path, List<String>> readFileA : mtmFiles.entrySet()) { // loading FileA from HashMap
            List<String> linesOfFileA = readFileA.getValue(); // get value of hashmap

            for (String lineFromFileA : linesOfFileA) { // for each line of FileA
                String[] columnOfFileA = lineFromFileA.split(";"); // Splitting the content of file to get the value of
                                                                   // Column C of FileA

                if (loadedFileFirstCoulmns.matches(columnOfFileA[2])) { // Checks if LoadedFile's column 1 value of
                                                                        // respective row exists in Column C of File A

                    System.out.println("-----------Inside ------------");
                    for (Map.Entry<Path, List<String>> readFileB : portfolioFiles.entrySet()) { // loading FileB from
                                                                                                // HashMap
                        List<String> linesOfFileB = readFileB.getValue(); // get value of hashmap

                        for (String lineFromFileB : linesOfFileB) { // for each line of FileB
                            String[] columnOfFileB = lineFromFileB.split(","); // Splitting the content of file to get
                                                                               // the value of Column 1
                            if (columnOfFileA[1].equals(columnOfFileB[1])) { // Checks if FileA's column 1 value of
                                                                             // respective row exists in File B

                                // Load the row of LoadedFile into byte stream
                                System.out.println("------------------ Found Match for" + loadedFileCoulmns); // Finally
                                                                                                              // load
                                                                                                              // the row
                                                                                                              // from
                                                                                                              // respective
                                                                                                              // loaded
                                                                                                              // file
                                                                                                              // into
                                                                                                              // byte
                                                                                                              // array

                            }
                        }
                    }
                }
            }
        }

    }

    /* Driver function to check for above functions */
    public static void main(String[] args) throws InterruptedException {
        ExecutorService executorService = Executors.newFixedThreadPool(700);
        List<String> files = new ArrayList<>();
        for (String file : files) {
            executorService.submit(createByteData(file));
        }

        executorService.awaitTermination(100000, TimeUnit.HOURS);
    }
...