使用Talend从Excel复制到SQL时出现内存和运行时问题

时间:2014-06-02 13:01:26

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

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

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

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

我的Excel工作表位于我的本地计算机上,因为我正在将数据复制到服务器上的SQL表。 我将运行/调试设置保持为Xms 1024M,Xmx 8192m。但它还是不起作用。

我可以知道如何解决这个问题?

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

enter image description here

3 个答案:

答案 0 :(得分:2)

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

生成的代码是每个子工作的函数。 onSubJob和onComponentOk之间代码生成的不同之处在于OnComponent ok将调用下一个函数,而OnSubJobOk则等待当前的subjob / function完成。后者让Garbage Collerctor功能更好。

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

答案 1 :(得分:2)

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

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

Use an independent process to run subjob option in tRunJob

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

它实际上属于一个单独的问题,但您也可以在工作中使用并行化来提高性能。

答案 2 :(得分:-1)

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

这个版画屏幕显示了如何做到这一点。

enter image description here