【发布时间】:2013-12-13 03:55:16
【问题描述】:
我正在编写从平面文件中读取的 Spring Batch,做很少的处理并将摘要写入输出文件。与阅读器相比,我的处理器和编写器相对更快。我正在使用 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="	" />
<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;
}
【问题讨论】:
-
发布配置和一些代码。很难说,如果你正在做切换,也许你正在做很多转换(转换为一个对象很耗时),这也会降低性能。
-
你的
companyMapper是什么?你能多发布一些关于你的工作配置的信息吗? -
感谢您的回复 M. Deinum 。你能在这里看到任何范围吗?
-
System.currentTimeMillis()相对较慢,不会在高性能代码中添加它。日志记录也是如此,具体取决于您记录的位置,这可能会很慢(基本上写到System.out真的很慢。)。日志记录也(总是)执行String.concat。会尝试先删除那些,看看会发生什么。 -
也对你认为慢的东西感兴趣(你的过程需要多长时间)。您可能还想将配置文件(例如 JProfiler)附加到您的代码中,并查看所有这些类中发生了什么。
标签: performance batch-processing spring-batch