Bonjour,

J'ai un OutOfMemoryException lorsque j'essaie de lire un fichier .csv de plus d'1M de lignes qui fait 900Mo de taille sur disque.

J'ai fait quelques recherches sur Google pour trouver des discussions et tutos sur les MultiResourcePartioner mais ça ne résout pas mon problème !

Voici ma classe de config :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
@Slf4j
@Configuration
@EnableBatchProcessing
@ComponentScan({
        "fr.payet.flad.batch",
        "fr.payet.flad.batch.tasklet"
})
public class BatchConfig {
 
    @Autowired
    private StepBuilderFactory steps;
 
    @Autowired
    private JobBuilderFactory jobBuilderFactory;
 
    @Autowired
    private DemoTasklet demoTasklet;
 
    @Bean
    public ResourcelessTransactionManager transactionManager() {
        return new ResourcelessTransactionManager();
    }
 
    @Bean
    public JobRepository jobRepository(ResourcelessTransactionManager transactionManager) {
        MapJobRepositoryFactoryBean mapJobRepositoryFactoryBean = new MapJobRepositoryFactoryBean(transactionManager);
        mapJobRepositoryFactoryBean.setTransactionManager(transactionManager);
        try {
            return mapJobRepositoryFactoryBean.getObject();
        } catch (Exception ex) {
            log.error("Exception : {}", ex.getMessage(), ex);
            return null;
        }
    }
 
 
    @Bean
    @StepScope
    public FlatFileItemReader<Balance> csvAnimeReader() {
        FlatFileItemReader<Balance> reader = new FlatFileItemReader<>();
        DefaultLineMapper lineMapper = new DefaultLineMapper();
        FieldSetMapper fieldSetMapper = new BalanceFieldSetMapper();
        DelimitedLineTokenizer tokenizer = new DelimitedLineTokenizer();
        tokenizer.setNames(new String[]{
                "EXER",
                "IDENT",
                "NDEPT",
                "LBUDG",
                "INSEE",
                "SIREN",
                "CREGI",
                "NOMEN",
                "CTYPE",
                "CSTYP",
                "CACTI",
                "FINESS",
                "SECTEUR",
                "CBUDG",
                "CODBUD1",
                "COMPTE	",
                "BEDEB",
                "BECRE",
                "OBNETDEB",
                "OBNETCRE",
                "ONBDEB",
                "ONBCRE",
                "OOBDEB",
                "OOBCRE",
                "SD",
                "SC"
        });
        tokenizer.setDelimiter(";");
 
        lineMapper.setLineTokenizer(tokenizer);
        lineMapper.setFieldSetMapper(fieldSetMapper);
        reader.setLineMapper(lineMapper);
        reader.setResource(new ClassPathResource("Balance_Commune_2016.csv"));
        reader.setLinesToSkip(1);
        return reader;
    }
 
 
    @Bean
    public ItemProcessor<Balance, Balance> CsvFileProcessor() {
        return new BalanceProcessor();
    }
 
    @Bean
    public BalanceWriter balanceWriter() {
        return new BalanceWriter();
    }
 
    @Bean
    @StepScope
    public MultiResourcePartitioner partitioner() {
        MultiResourcePartitioner partitioner = new MultiResourcePartitioner();
        ClassLoader cl = this.getClass().getClassLoader();
        ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(cl);
        try {
            Resource[] resources = resolver.getResources("Balance_Commune_2016.csv");
            partitioner.setResources(resources);
            partitioner.partition(1000);
            return partitioner;
        } catch (IOException e) {
            log.error("IO Exception : {}", e.getMessage(), e);
        }
        return null;
    }
 
    @Bean
    public TaskExecutor taskExecutor() {
        ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
        taskExecutor.setMaxPoolSize(50);
        taskExecutor.setCorePoolSize(20);
        taskExecutor.setQueueCapacity(50);
        taskExecutor.afterPropertiesSet();
        return taskExecutor;
    }
 
    @Bean
    @Qualifier("masterStep")
    public Step masterStep() {
        return steps.get("masterStep")
                .partitioner(step1())
                .partitioner("step1", partitioner())
                .taskExecutor(taskExecutor())
                .build();
    }
 
    @Bean
    public SimpleJobLauncher jobLauncher(JobRepository jobRepository) {
        SimpleJobLauncher simpleJobLauncher = new SimpleJobLauncher();
        simpleJobLauncher.setJobRepository(jobRepository);
        return simpleJobLauncher;
    }
 
    @Bean
    public Step step1() {
        return steps.get("step1")
                .<Balance, Balance>chunk(1)
                .reader(csvAnimeReader())
                .writer(balanceWriter())
                .build();
    }
 
    @Bean
    public Step step2() {
        return steps.get("step2")
                .tasklet(demoTasklet)
                .build();
    }
 
    @Bean
    public Job readCsvJob() {
        return jobBuilderFactory.get("readCsvJob")
                .incrementer(new RunIdIncrementer())
                .flow(masterStep())
                .next(step1())
                .next(step2())
                .end()
                .build();
    }
}