处理带有连接的大型csv文件的Clover ETL性能问题

时间:2017-07-12 11:21:57

标签: cloveretl

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

基本上我用过:

  1. 要在文件中读取的平面文件阅读器
  2. 接下来是一些' Lookup Join'从DB
  3. 转换一些值
  4. 然后是一个' ExtHashJoin'链接所有数据(因为源没有排序)
  5. 然后将记录插入数据库。
  6. 非常简单的过程,适用于少量记录。但是当我尝试导入整个文件时,它只是耗尽了内存(增加了内存分配并没有帮助)。

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

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

    如何告诉平面文件阅读器打破记录并分批处理?

    感谢。

    Eric

1 个答案:

答案 0 :(得分:1)

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

  1. 正如您正确指出的那样,ExtHashJoin组件会等到所有记录(来自从端口)在加入开始之前流入。通常,如果要连接的从端口记录数量相当低,我们建议使用ExtHashJoin组件。如果不是这种情况,我建议使用ExtMergeJoin组件。没有缓存(与ExtHashJoin不同),因此处理速度可以明显加快。您可以像对ExtHashJoin组件那样对ExtMergeJoin组件应用相同的主/从键定义和映射。但是,您需要在图形中的SimpleCopy组件之前放置一个新的ExtSort组件,以便发送已排序的数据。排序键应与ExtMergeJoin组件中定义的主密钥一致。
  2. 如果数据的排序顺序在从FlatFileReader到ExtHashJoin组件的路上没有改变,那么甚至可能有一种更简单的方法来减少内存消耗。尝试使用新的Combine组件替换ExtHashJoin组件,并应用与ExtHashJoin组件相同的映射。 Combine组件也避免了缓存记录,也不需要按键加入,因此性能应该相当不错。
  3. 有关此主题的更多详细信息,请参阅CloverETL论坛:http://forum.cloveretl.com/viewtopic.php?p=12926#p12926