我有一个简单的任务,即将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。 我附上了我的工作截图。
答案 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组件将它们全部链接起来,并确保选中勾选“使用独立进程运行子作业”:
这将为进程生成一个全新的JVM实例,因此不会被JVM绑定。也就是说,你应该注意不要产生太多的JVM实例,因为在启动JVM时会有一些开销,显然你仍然受到任何物理内存限制的限制。
它实际上属于一个单独的问题,但您也可以在工作中使用并行化来提高性能。
答案 2 :(得分:-1)
为避免作业(outOfMemory)占用过多内存,您可以将tmap中的大型转换数据存储在磁盘上的临时目录中。
这个版画屏幕显示了如何做到这一点。