用于处理1.15亿条记录以便插入Oracle的性能优化

时间:2015-09-22 13:01:23

标签: spring-batch

我有一个要求,我正在阅读一个放在Unix大小为19 GB的文本文件,其记录大约为1.15亿。一旦文件放在该位置,我的Spring Batch(Launcher)就会被Autosys和Shell脚本触发。

最初在执行此过程时,需要大约72小时才能读取,处理(空检查和解析日期)并将数据写入Oracle数据库。

但是在使用Throttle Limit,Task Executor等某些配置更改后,我能够将执行时间减少到目前的28小时。 我需要这个过程在4小时内完成,同样,单独使用SQL loader我将在35分钟内完成工作。但我必须只使用spring Batch。

任何人都可以告诉我是否有可能在不到4个小时内使用弹簧批次完成它并且最好的方法是什么?

1 个答案:

答案 0 :(得分:1)

在一个项目中,我工作过,我们不得不将50亿条记录从db2传输到oracle。具有相当复杂的转换逻辑。在转换过程中,数据在不同的文件中保存了大约4次。我们能够在oracle db中连续插入大约50'000条记录的数据。从这个角度来看,在4小时内完成它似乎是现实的。

你没有说明你的瓶颈究竟在哪里,但这里有一些想法。

  1. 并行化 - 你可以将文件拆分成块,这可能是并行的processid,例如我们工作的几个实例吗?
  2. chunksize - 我们在写入oracle时使用了5000到10000的块大小。
  3. 删除不必要的数据解析,尤其是日期/时间戳解析 - 例如,我们的数据中有很多时间戳,但它们与处理逻辑无关。由于我们必须在处理期间多次从/向文件读取和写入它们,我们没有解析,我们只保留了字符串表示。此外,很多时间戳都有特殊值,如1.1.0001 00:00:00.000000或31.12.9999 23.59.59.000000,我们使用LD或HD(低日期和高日期)代表它们。
  4. HTH。