【发布时间】:2019-09-01 01:13:08
【问题描述】:
我有一个弹簧批处理步骤,它从文件中读取、处理记录并使用卡盘处理写入文件。该文件预计将有数百万条大记录。我读到 Spring 在将其传递给编写器之前在内存中保存了 [chunk-size] 数量的已处理记录。
为了优化内存使用,我将 [chunk-size] 设置得很小。但是,这会增加该步骤对 BATCH_STEP_EXECUTION 元数据表执行的更新次数,以更新读取和提交计数。
鉴于我正在读取和写入本地文件,对远程数据库服务器的更新相对昂贵。如果我增加 [chunk-size],内存使用量就会增加。
提交频率对于编写本地文件并不重要,因此元数据更新对我来说是个问题。该步骤是可重新启动的,因此从技术上讲,我不需要记录中间提交计数。
我可以只为 JobRepository 使用地图或内存数据库,但我需要保留其他信息,例如开始/结束时间,而且这个问题只针对一个步骤。
是否有任何配置参数可以关闭对作业存储库的中间提交计数更新,或者说更早地将块记录从内存写入存储,仅以块大小/提交频率提交。基本上我正在寻找是否有将块大小与提交频率分开的东西。
【问题讨论】:
-
您提到使用内存中的作业存储库,这就是您的情况 IMO 的方式。
I am looking if there is something that separates chunk-size from commit-frequency:提交频率取决于块大小和数据源中的项目数。这些是相关的概念,不可能将它们分开。如您所述,块大小值是内存使用量和速度之间的权衡,“最佳”值只能以经验方式确定。希望这会有所帮助。