读取具有 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条评论
登录后参与评论

相关文章

来自分类Dev

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

来自分类Dev

读取具有可变大小的行的数据文件

来自分类Dev

读取具有可变大小的行的数据文件

来自分类Dev

Spring Batch ItemReader读取多行和动态块大小

来自分类Dev

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

来自分类Dev

R:读取具有行和列名称的csv

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

Spring Batch-读取CSV文件并写入MySQL数据库,给出int和Date数据类型错误

来自分类Dev

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

来自分类Dev

随机创建大小为1M,10M,100M,1G,10G的文件和文件夹

来自分类Dev

如何使用Spring-Batch读取id列分块的csv行?

来自分类Dev

C ++程序,用于读取数组中具有恒定(但未知)列数的未知大小的csv文件(仅用浮点数填充)

来自分类Dev

从DataReader读取数据时出现OutOfMemoryException

来自分类Dev

'OutOfMemoryException'读取20mb XLSX文件

来自分类Dev

读取具有一行和多个变量的txt文件时遇到麻烦

来自分类Dev

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

来自分类Dev

创建csv文件具有与读取文件相同的名称

来自分类Dev

使用.read_csv读取csv文件的所有行

来自分类Dev

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

来自分类Dev

如何读取具有两个数据集(即两个不同的标题和列)的 CSV 文件

来自分类Dev

在熊猫中读取具有历史日期的CSV文件

来自分类Dev

读取在SSIS中具有JSON列的csv文件吗?

来自分类Dev

使用tidyverse读取具有日期变量的csv文件

来自分类Dev

读取具有不同标题/列的csv日志文件

来自分类Dev

读取CSV文件中具有特定模式的文本

来自分类Dev

Powershell脚本获取具有文件夹的文件名和文件大小的csv文件

Related 相关文章

  1. 1

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

  2. 2

    读取具有可变大小的行的数据文件

  3. 3

    读取具有可变大小的行的数据文件

  4. 4

    Spring Batch ItemReader读取多行和动态块大小

  5. 5

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

  6. 6

    R:读取具有行和列名称的csv

  7. 7

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

  8. 8

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

  9. 9

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

  10. 10

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

  11. 11

    Spring Batch-读取CSV文件并写入MySQL数据库,给出int和Date数据类型错误

  12. 12

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

  13. 13

    随机创建大小为1M,10M,100M,1G,10G的文件和文件夹

  14. 14

    如何使用Spring-Batch读取id列分块的csv行?

  15. 15

    C ++程序,用于读取数组中具有恒定(但未知)列数的未知大小的csv文件(仅用浮点数填充)

  16. 16

    从DataReader读取数据时出现OutOfMemoryException

  17. 17

    'OutOfMemoryException'读取20mb XLSX文件

  18. 18

    读取具有一行和多个变量的txt文件时遇到麻烦

  19. 19

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

  20. 20

    创建csv文件具有与读取文件相同的名称

  21. 21

    使用.read_csv读取csv文件的所有行

  22. 22

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

  23. 23

    如何读取具有两个数据集(即两个不同的标题和列)的 CSV 文件

  24. 24

    在熊猫中读取具有历史日期的CSV文件

  25. 25

    读取在SSIS中具有JSON列的csv文件吗?

  26. 26

    使用tidyverse读取具有日期变量的csv文件

  27. 27

    读取具有不同标题/列的csv日志文件

  28. 28

    读取CSV文件中具有特定模式的文本

  29. 29

    Powershell脚本获取具有文件夹的文件名和文件大小的csv文件

热门标签

归档