【问题标题】:Memory and Running Time issues while copying from Excel to SQL using Talend使用 Talend 从 Excel 复制到 SQL 时出现内存和运行时间问题
【发布时间】:2014-06-02 13:01:26
【问题描述】:

我有一个简单的任务,就是将 Excel 数据复制到 SQL 表中。 我最初正在执行一个存储过程来删除表条目。然后我有 Excel 输入,我使用 tMap 将数据复制到 SQL 表中。

我有 20 个表要复制数据。我要复制的表条目数量相对较少(10-100)。 仍然当我执行任务时,它需要很长时间(5-10 分钟),并且在复制 12 个表条目后,它的内存不足。

我的工作流程是.. (存储过程 ->(在子作业上)-> excel 输入 -> tmap -> tMSSqlOutput ->(在组件上)-> excel 输入 -> tmap -> tMSSqlOutput(在组件上)-> ...... -> excel 输入 -> tmap -> tMSSqlOutput)

当我将数据复制到服务器上的 SQL 表时,我的 Excel 工作表在我的本地计算机上。 我将运行/调试设置保持为 Xms 1024M、Xmx 8192m。但它仍然无法正常工作。

我可以知道我可以做些什么来解决这个问题吗?

我在 VM(虚拟机)上运行我的 talend。 我附上了我的工作截图。

【问题讨论】:

  • 你能发一张你的工作截图吗?
  • 我已经在我的问题中编辑了它。

标签: sql performance memory talend long-running-processes


【解决方案1】:

您应该在单独的子作业中运行所有这些单独的步骤,使用“on subjob ok”来链接它们,以便 Java 垃圾收集器可以更好地在步骤之间重新分配内存。

如果这仍然不起作用,您可以将它们分成完全独立的作业并使用 tRunJob 组件将它们全部链接,并确保选择勾选“使用独立进程运行子作业”:

这将为进程生成一个全新的 JVM 实例,因此不会被 JVM 占用内存。也就是说,您应该注意不要生成太多 JVM 实例,因为在启动 JVM 时会有一些开销,而且显然您仍然受到任何物理内存约束的限制。

它确实属于一个单独的问题,但您也可能会发现在工作中使用并行化来提高性能有一些好处。

【讨论】:

  • 在子作业上使用 ok 已修复运行时间问题。能够在 2 分钟内复制 1500 行。但我想知道它是否也能解决我的记忆问题?
  • 唯一知道的方法是等待,看看它是否内存不足,但我希望它能很好地处理它。您之前遇到的问题是 JVM 将所有 Excel 表的所有数据保存在内存中,而不是删除它们,因为它希望您稍后返回并访问它们。由于情况并非如此,您应该明确使用 on subjob OK 链接。仅当您明确想要跟进诸如数据库提交之类的事情时,才应使用组件上的 OK 链接。
  • 好的。感谢您的宝贵建议。
【解决方案2】:

在 excelInput 上使用 onSubJobOK 连接到下一个 ExcelInput。这将改变整个代码生成。

生成的代码是每个子作业的函数。 onSubJob 和 onComponentOk 在代码生成上的区别在于 OnComponent ok 会调用下一个函数,而 OnSubJobOk 会等待当前的子作业/函数完成。后者让垃圾收集器功能更好。

如果这不能解决问题,请创建包含 1 个 excel-DBoutput 的子作业。然后将这些作业与主作业中的 OnSubjobOK 链接。

【讨论】:

  • 我也只是在输入我的答案 :) 要点是正确的,这些子作业应该在子作业上连接好,但是还有一个“核选项”可以使用完全不同的进程,这将产生新的 JVM 实例。
  • 在子作业上使用 ok 已修复运行时间问题。能够在 2 分钟内复制 1500 行。但我想知道它是否也能解决我的记忆问题?
【解决方案3】:

为避免作业消耗过多内存 (outOfMemory),您可以将大量转换后的数据存储在磁盘上的临时目录中的 tmap 中。

此打印屏幕显示了如何执行此操作。

【讨论】:

  • 这不是 tMap 问题。此外,在那里设置路径还不够,但您需要为每个查找启用存储。
猜你喜欢
  • 1970-01-01
  • 2011-07-30
  • 2014-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-24
  • 1970-01-01
  • 2010-11-06
相关资源
最近更新 更多