Не удается прочитать большой файл (8 ГБ) с помощью пакета Spring

#java #out-of-memory #spring-batch #filereader #partitioning

#java #не хватает памяти #spring-batch #filereader #разделение

Вопрос:

У меня есть 60 миллионов записей в одном CSV размером около 8 ГБ.

Необходимо прочитать записи из файла и вставить его в базу данных с помощью JPA.

Пытаюсь прочитать этот файл с помощью пакета Spring, но производительность очень низкая. Строки, которые я добавил к максимальному размеру блока до 1500, но не сработали.

также добавлен исполнитель задач, создающий потоки, но не работает.

Конфигурация системы. t2. xl имеет 16 гигабайт памяти и 4 vCPU, а также 16 ГБ оперативной памяти и 4-ядерный процессор

  @Bean
public Step step3() {
    return stepBuilder
            .get("step3")
            .<main_Data, main_Data>chunk(1500)
            .reader(this.mainDataReader)
            .processor(this.main_data_processor)
            .writer(this.mainDataWriter).taskExecutor(taskExecutor())
            .build();
}



@Bean
public  TaskExecutor taskExecutor(){
    SimpleAsyncTaskExecutor simpleAsyncTaskExecutor = new SimpleAsyncTaskExecutor();
    simpleAsyncTaskExecutor.setConcurrencyLimit(5);
    return  simpleAsyncTaskExecutor;
}
  

также попробуйте с

   @Bean
public TaskExecutor taskExecutor2() {
   ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
   executor.setCorePoolSize(64);
   executor.setMaxPoolSize(64);
   executor.setQueueCapacity(64);
   executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
   executor.setThreadNamePrefix("MultiThreaded-");
    return executor;
}
  

Я также пробовал с OpenCSV, но получал дубликаты записей с помощью Opencsv.

Есть предложения по производительности Spring batch или другому способу чтения этого файла?

Комментарии:

1. Вы уверены, что вам нужно прочитать весь файл в память? Если ваша цель — либо сохранить каждую запись в базе данных, либо переформатировать записи и записать их в другой файл, вы можете выполнить эту операцию построчно.

2. Не уверен, какова ваша цель здесь. Вы хотите обработать данные из файла CSV? Если это так, возможно, сделайте это и в потоках. Если вы просто загрузите его в память, он будет оставаться медленным, независимо от того, сколько потоков или ядер процессора вы на него бросаете, 8 ГБ — это много данных для размещения в памяти.

3. @Jakub Biernaczyk Нет необходимости читать весь файл в память. Можно читать фрагментами и нужно вставить в БД. Ему удалось прочитать фрагменты, но возникла проблема со временем / медленностью.

4. docs.spring.io/spring-batch/docs/current/reference/html/…

5. performance is very slow : у вас есть какие-то цифры? Что, по вашему мнению, медленно? Rows I have added chunk size max to 1500 but didn't work. : что конкретно не сработало? Вы пробовали разбивать свой файл на разделы?