读取具有 1M 行和 900Mo 大小的 csv 文件时,Spring Batch OutOfMemoryException

加森

我正在尝试使用 a 读取一个包含超过 100 万行的非常大的 CSV 文件,FlatFileItemReader但是在启动我的批处理作业时,我OutOfMemoryException在大约 10 分钟后得到了一个

这是我的代码:

@Slf4j
@Configuration
@EnableBatchProcessing
@ComponentScan({
        "f.p.f.batch",
        "f.p.f.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_Exemple_2016.csv"));
    reader.setLinesToSkip(1);
    return reader;
}


@Bean
public ItemProcessor<Balance, Balance> CsvFileProcessor() {
    return new BalanceProcessor();
}

@Bean
public BalanceWriter balanceWriter() {
    return new BalanceWriter();
}

@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(step1())
            .next(step2())
            .end()
            .build();
}

}

维维克·斯旺西

我建议您使用流式传输,因为您永远不想一次读取所有文件,这是一个主要问题。

是一篇不错的文章,如何在不占用整个内存空间的情况下更有效地读取文件

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用Spring Batch读取以将输入CSV文件中的行转换为具有1到多关系的CSV文件

在Matlab中读取具有不同大小的行的csv文件

Spring Batch读取不同的CSV文件和XML输出

VBA:如何读取具有不同结构行的csv文件?

C#读取CSV文件| 具有标题行和逗号分隔的值

块大小和页面大小之间的区别Spring Batch

Spring Batch - 在具有读取器和写入器的步骤中配置 Tasklet?

读取具有固定大小列的文件

将具有不同大小和不同键的字典列表写入csv文件并读回

比较fread与read.table的速度以读取100M中的前1M行

读取具有类似csv名称的文件

读取具有多个标题的CSV文件

读取csv文件中的最后一行或具有最新值的行

如何在Spring Batch中使用unknow列名和unknow列数读取csv?

Spring Batch 中只有 1 个块大小是不是很糟糕?

读取具有已知列和未知列的CSV文件Java

如何读取具有列分隔符和记录分隔符的 csv 文件

从具有不同列数的 csv 文件中读取和选择项目

如何使用.net读取具有2900万行数据的巨大CSV文件

熊猫读取具有可变行的CSV文件,以在行的开头跳过特殊字符

如何在熊猫中读取具有行名称的数据框的CSV文件

如何将具有多个标题行的csv文件读取到熊猫中?

如何使用spring-batch和MultiResourceItemReader读取文件夹中的所有文件?

当 Spring Batch 读取和使用 JobRepository 持久化的数据时

从DataReader读取数据时出现OutOfMemoryException

Windows Batch读取TXT并将行解析为CSV

巨大的数组大小[1M]可能是堆栈溢出

Spring Batch:使用quoteCharacter解析CSV文件

Spring Batch:如何使用FlatFileItemReader读取CSV文件的页脚并进行验证