当前位置: 首页 > 知识库问答 >
问题:

如何在SpringBatch中提高FlatFileItemReader的性能?

隗俊誉
2023-03-14

我正在编写spring批处理,它从平面文件中读取数据,很少进行处理,并将摘要写入输出文件。与reader相比,我的处理器和写入程序相对更快。我正在使用FlatFileItemReader,并尝试了从50-1000开始的各种提交间隔。我的批处理作业必须以更快的速度处理1000万条记录。请告诉我如何提高FlatFileItemReader的速度。粘贴到我的配置文件和映射器类下面,读取字段集并将值设置为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>

公司Mapper.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个答案

劳夕
2023-03-14

你好,提高阅读器速度的最终方法是在内存中读取文件。如果你有足够的内存,你可以一次读取它。如果你没有,你可以尽可能多地阅读。一旦将其存储在内存中,就需要实现“资源”,而物理文件将指向文件的内存内容。如果现代硬盘速度超过每秒500mg,即使是巨大的文件也会在内存中完全读取几秒钟。

一旦它进入内存,您的所有操作都将以数量级的速度运行。如果您愿意,这也将为您提供线性扩展功能。

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

景令秋
2023-03-14

我想既然你说的是1000万数据,我建议你使用spring批处理缩放功能。我最近实施了向db发布500-800万个数据。为了获得性能,我使用文件通道(快速读/写)将文件拆分为100万个,然后使用分区,在从属步骤中使用单独的线程读取100万个文件。虽然对于小数据,您可能无法获得良好的性能差异,但对于这种规模的数据,会产生巨大的差异。而且正如@M.Deinum所建议的,尝试删除日志记录。它肯定会慢下来。

贝钧
2023-03-14

我认为您不能太快地加快流程://code>CompanyMapper已经是一个定制的实现,所以您可以考虑:

  1. 编写一个自定义的LineTokinizer字段集,以避免大量(有用的)检查和错误处理
 类似资料:
  • 我有一个名为Emails的列族,我正在将邮件保存到这个CF中,编写5000封邮件需要100秒。 我使用的是i3处理器,8gb内存。我的数据中心有6个节点,复制因子=2。 我们存储在卡桑德拉中的数据大小会影响性能吗?影响写入性能的所有因素是什么,如何提高性能? 预先感谢..

  • 用例:步骤1:ItemReader:从数据库中读取1000个ItemProcessor块中的数据:处理这些数据。ItemWriter:将数据写入地图,以便下一步使用 步骤2:ItemReader:读取地图ItemProcessor:处理地图数据并获取新对象。ItemWriter:将新的进程对象持久化到数据库中。 现在我希望Map在整个作业中保持不变,目前我已经为Map创建了一个不同的POJO类,并

  • 问题内容: 我在公司中多次设计数据库。为了提高数据库的性能,我只寻找标准化和索引。 如果要求您提高数据库的性能,该数据库包含大约250个表以及一些具有数百万个记录的表,那么您将寻找什么不同的东西? 提前致谢。 问题答案: 优化逻辑设计 逻辑级别是关于查询和表本身的结构。首先尝试最大程度地发挥这一作用。目标是在逻辑级别上访问尽可能少的数据。 拥有最高效的SQL查询 设计支持应用程序需求的逻辑架构(例

  • 问题内容: Python中最快的FFT实现是什么? 似乎numpy.fft和scipy.fftpack都基于fftpack,而不是FFTW。fftpack和FFTW一样快吗?使用多线程FFT或使用分布式(MPI)FFT怎么办? 问题答案: 当然,您可以使用Cython或其他具有类似想法的工具(可以访问外部库)包装要测试的任何FFT实现。 基于GPU 如果要测试FFT实现,则还可以查看基于GPU的代

  • 问题内容: 我需要知道abt在mongo中的索引如何提高查询性能。并且当前我的数据库没有索引。如何索引现有数据库?我是否还需要创建一个仅用于索引的新字段? 问题答案: 从根本上说,MongoDB中的索引类似于其他数据库系统中的索引。MongoDB支持MongoDB集合中文档中包含的任何字段或子字段上的索引。 索引在这里详细介绍,我强烈建议您阅读本文档。 其中包括有关索引操作,策略和创建选项的部分,

  • 问题内容: 我有2张桌子,和。用户可以有很多游戏。我需要所有有人数的人,以及他们的人数(有专栏的)。 附言:我需要将所有数据加载到管理表中。由于游戏太多。我决定对数据进行分页和限制。但是,甚至限制以下查询也需要花费相同的时间。如何更好地查询? 问题答案: 您可以在下面尝试使用表达式