我正在编写从平面文件读取的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="	" />
<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 :(得分:1)
我认为你不能加速很多过程:/
CompanyMapper
已经是一个自定义实现,因此您可以这样想:
LineTokinizer
+ FieldSet
对,以避免大量(有用的)检查和错误处理BufferedReaderFactory
来创建自己的BufferedReader
实现,其中包含自定义(和更快)InputStream
实现(请查看Google)答案 1 :(得分:1)
我想因为你讲的是1000万个数据,我建议你使用弹簧批量缩放功能。我最近实施了向数据库发送5-8百万个数据。为了获得性能,我使用文件通道(快速读/写)将文件拆分为100万,然后使用分区我使用单独的线程在我的从属步骤中读取每个100万个文件。虽然您可能无法获得小数据的良好性能差异,但对于这种数量的数据会产生巨大的差异。而且正如@M所建议的那样。 Deinum尝试删除Logging。它肯定会放慢速度。
答案 2 :(得分:0)
您好,加快读者速度的最终方法是在内存中读取您的文件。如果您有足够的内存,您可以立即阅读。如果你没有,你可以尽可能多地阅读。一旦你在内存中,你需要实现你的资源&#34;相反,物理文件将指向文件的内存内容。如果现代硬盘速度超过每秒500毫克,即使是巨大的文件也会在内存中完全读取几秒钟。
一旦它在内存中,所有操作的运行速度都会快一些。如果您愿意,这也将为您提供线性扩展功能。
如果您的内容在内存中,您可以轻松地对作品进行整理,而不会在硬盘周围形成瓶颈。