#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.
: что конкретно не сработало? Вы пробовали разбивать свой файл на разделы?