【问题标题】:Performance optimization for processing of 115 million records for inserting into Oracle处理 1.15 亿条记录以插入 Oracle 的性能优化
【发布时间】:2015-09-22 13:01:23
【问题描述】:

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

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

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

谁能告诉我是否有可能使用 Spring Batch 在 4 小时内完成它,以及实现这一目标的最佳方法是什么?

【问题讨论】:

  • 这是一个非常广泛的问题,您是否有一些特定的瓶颈想要提高性能,并且您是否进行了一些分析等以找到瓶颈,如果本机 SQL 加载需要 35 分钟,那么问题也就是说,除了读取和插入/更新之外,批处理还有什么必要的空检查? ...更多细节请:-)

标签: spring-batch


【解决方案1】:

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

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

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

HTH。

【讨论】:

    猜你喜欢
    • 2018-09-11
    • 1970-01-01
    • 2014-08-30
    • 2020-12-31
    • 2020-02-21
    • 2011-02-20
    • 2011-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多