2013-11-27 119 views
0

我正在写一个从平面文件中读取的spring批处理,稍做处理并将汇总写入输出文件。与阅读器相比,我的处理器和作者相对更快。我正在使用FlatFileItemReader,并尝试了从50-1000开始的广泛的提交间隔。我的批处理作业必须以更快的速度处理10百万条记录。请让我知道如何提高FlatFileItemReader的速度。粘贴在我的配置文件下面,我的Mapper类读取字段集并将值设置为POJO bean。提前致谢。如何提高SpringBatch中FlatFileItemReader的性能?

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; 
} 
+0

发布配置和一些代码。很难说,也许你正在做大量的转换(转换为一个对象非常耗时),如果你正在进行切换,这也会带走性能。 –

+0

你的'companyMapper'是什么?你可以在工作配置上多发一点吗? –

+0

感谢您的回复M. Deinum。你能在这里看到任何范围吗? –

回答

1

我认为你不能加快行动进程不少:/ CompanyMapper已经是一个自定义实现,所以你可以认为:

  1. 写一个自定义LineTokinizer + FieldSet对夫妇为了避免大量的(有用的)检查和错误处理
  2. 编写自定义BufferedReaderFactory来创建自己的实施BufferedReader一个封装了自定义(快)InputStream执行情况(看看谷歌为)
1

我想因为你讲的是1000万条数据,我建议你使用spring批量缩放功能。我最近实现了将5-8百万个数据发布到db的实现。为了获得性能,我使用文件通道(快速读/写)将文件分割为一百万,然后使用分区我使用一个单独的线程读取每个包含一百万个文件的文件。尽管对于小数据你可能不会获得很好的性能差异,但是对于这样大小的数据却有很大的不同。还有@M所建议的。 Deinum尝试删除记录。它肯定会放慢速度。

0

你好加速你的读者的最终方法是读你的文件在内存中。只要你有足够的内存,你可以一次读取它。如果你不这样做,你可以尽可能多地阅读。一旦你在内存中,你需要实现你的“资源”,而不是物理文件将指向你的文件的内存内容。假设现代硬盘速度超过每秒500毫克,即使是巨大的文件也会在内存中完整读取几秒钟。

一旦它进入内存,您的所有操作将会以更快的速度运行。如果您愿意,也可以为您提供线性缩放功能。

如果你在内存中有你的内容,你可以轻松地平行工作,而不会在硬盘上形成瓶颈。