处理带有联接的大型 csv 文件时出现的 Clover ETL 性能问题



我正在使用CloverETL工具来读取超过100,000行的大型csv文件,在将它们插入数据库表之前从数据库转换一些查找值。

基本上我使用了:

  1. 用于读取文件的平面文件读取器
  2. 后跟一些"查找联接",用于转换数据库中的一些值
  3. 然后是"ExtHashJoin"来链接所有数据(因为源没有排序(
  4. 然后将记录插入数据库。

非常简单的过程,适用于少量记录。但是当我尝试导入整个文件时,它只是耗尽了内存(增加内存分配无济于事(。

我发现 ExtHashJoin 试图等到它加入所有记录后才开始插入它们,这似乎是问题所在,因为它必须将所有记录存储在内存中。我真的不需要这种行为。这些记录都是独立的,可以分批处理,例如一次每 1000 行处理一次,但我无法找到一种方法来做到这一点。

我还尝试设置不同的阶段值,但它仍然尝试在开始插入第一条记录之前连接所有值。

如何告诉平面文件读取器分解记录并批量处理它们?

谢谢。

埃里克

没有简单的方法可以强制 FlatFileReader 组件分解记录并批量处理它们。但是,我可以建议一些技巧,可以帮助您解决由 ExtHashJoin 组件引起的内存溢出问题:

  1. 正如您正确指出的,ExtHashJoin 组件会等到所有记录(从从端口(流入后再开始连接。通常,如果要连接的从端口记录数量相当少,我们建议使用 ExtHashJoin 组件。如果不是这种情况,我建议使用 ExtMergeJoin 组件。没有缓存(与ExtHashJoin不同(,因此处理速度可以明显加快。您可以对 ExtMergeJoin 组件应用与对 ExtHashJoin 组件相同的主/从密钥定义和映射。但是,您需要在图形中的 SimpleCopy 组件之前放置一个新的 ExtSort 组件,以便发送排序后的数据。排序键应与 ExtMergeJoin 组件中定义的主键一致。
  2. 如果数据的排序顺序在从 FlatFileReader 到 ExtHashJoin 组件的过程中没有更改,则可能还有更简单的方法来减少内存消耗。尝试将 ExtHashJoin 组件替换为新的 Combine 组件,并应用与 ExtHashJoin 组件相同的映射。合并组件也避免缓存记录,并且不需要通过键连接,因此性能应该相当不错。

有关此主题的更多详细信息,请访问CloverETL论坛:http://forum.cloveretl.com/viewtopic.php?p=12926#p12926

最新更新