如何在Spring Batch中提高FlatFileItemReader的性能?

时间:2013-11-27 13:19:38

标签: performance batch-processing spring-batch

我正在编写从平面文件读取的spring批处理,进行少量处理并将摘要写入输出文件。与阅读器相比,我的处理器和写入器相对更快。我正在使用FlatFileItemReader并尝试从50-1000开始的各种提交间隔。我的批处理作业必须以更快的速度处理1000万条记录。请告诉我提高FlatFileItemReader速度的方法。粘贴在我的配置文件下面,我的Mapper类读取字段集并将值设置为POJO bean。非常感谢提前。

BatchFileConfig.xml

<!-- Flat File Item Reader and its dependency configuration starts here -->
<bean id="flatFileReader" class="org.springframework.batch.item.file.FlatFileItemReader">
    <property name="resource" value="classpath:flatfiles/input_10KFile.txt" />
    <property name="encoding" value="UTF-8" />
    <property name="linesToSkip" value="1" />
    <property name="lineMapper">
        <bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper">
            <property name="lineTokenizer">
                <bean
                    class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer">
                    <property name="names"
                        value="var1,var2,var3,var4,var5,var6" />
                    <property name="delimiter" value="&#009;" />
                    <property name="strict" value="false" />
                </bean>
            </property>
            <property name="fieldSetMapper" ref="companyMapper">
            </property>
        </bean>
    </property>
</bean>

CompanyMapper.java

 public Company mapFieldSet(FieldSet fieldSet) throws BindException {
    logger.warn("Start time is "+System.currentTimeMillis());
    if (fieldSet != null) {
    Company company = new Company();
    company.setvar1(fieldSet.readString("var1"));
    company.setvar2(fieldSet.readInt("var2"));
    company.setvar3(fieldSet.readString("var3"));
    company.setvar4(fieldSet.readInt("var4"));
    company.setvar5(fieldSet.readInt("var5"));
    company.setvar6(fieldSet.readInt("var6"));
    return company;
    }
    return null;
}

3 个答案:

答案 0 :(得分:1)

我认为你不能加速很多过程:/ CompanyMapper已经是一个自定义实现,因此您可以这样想:

  1. 编写自定义LineTokinizer + FieldSet对,以避免大量(有用的)检查和错误处理
  2. 编写自定义BufferedReaderFactory来创建自己的BufferedReader实现,其中包含自定义(和更快)InputStream实现(请查看Google)

答案 1 :(得分:1)

我想因为你讲的是1000万个数据,我建议你使用弹簧批量缩放功能。我最近实施了向数据库发送5-8百万个数据。为了获得性能,我使用文件通道(快速读/写)将文件拆分为100万,然后使用分区我使用单独的线程在我的从属步骤中读取每个100万个文件。虽然您可能无法获得小数据的良好性能差异,但对于这种数量的数据会产生巨大的差异。而且正如@M所建议的那样。 Deinum尝试删除Logging。它肯定会放慢速度。

答案 2 :(得分:0)

您好,加快读者速度的最终方法是在内存中读取您的文件。如果您有足够的内存,您可以立即阅读。如果你没有,你可以尽可能多地阅读。一旦你在内存中,你需要实现你的资源&#34;相反,物理文件将指向文件的内存内容。如果现代硬盘速度超过每秒500毫克,即使是巨大的文件也会在内存中完全读取几秒钟。

一旦它在内存中,所有操作的运行速度都会快一些。如果您愿意,这也将为您提供线性扩展功能。

如果您的内容在内存中,您可以轻松地对作品进行整理,而不会在硬盘周围形成瓶颈。