1

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

基本上我用过:

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

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

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

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

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

谢谢。

埃里克

4

1 回答 1

1

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

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

有关此主题的更多详细信息可以在 CloverETL 论坛上找到:http: //forum.cloveretl.com/viewtopic.php?p =12926#p12926

于 2017-07-31T13:22:46.547 回答