2017-07-12 58 views
0

我有一份工作如下所示。 tmysqlinput_1具有需要更新/插入到tmysqloutput中的行。 tmysqlinput_2與tmysqloutput是同一個表。我通過內部連接在tmap中加入tmysqlinput_1和tmysqlinput_2。但是,當我在tmysqinput_1中放置了一些測試行,我知道這些行將導致更新分支並運行作業時,出現線程「Thread-0」中的錯誤java.lang.OutOfMemoryError:超出了GC開銷限制內存不足錯誤 - Talend插入/更新作業

我可以知道爲什麼這不會發生插入,但發生更新?

Job with update and insert branches

感謝 瑞斯

回答

0

這取決於它正在從數據庫下載到您的工作了Talend的數據量。

由於處理是標準的ETL處理,所有數據都將被加載到Talend作業中,從而消耗內存。根據您的行佈局(行數x列數x列數據類型),這將需要更多或更少的RAM。

因此,在這種情況下,我認爲查找代價非常高,並且會導致內存不足。

解決問題的一種方法是將處理更改爲ELT組件,這些組件將完整處理設置到數據庫中而不是Talend作業中。

另一種方法是根據使用情況在tMySQLOutput中使用「插入忽略」或「插入或更新」。

0

你可以通過選擇溫度選項真正的TMAP用於查找設置磁盤上的這個連接並給予TMAP設置

+0

我想這一個臨時直供通道,但還是我得到了同樣的錯誤 –

+0

我想同樣的情景,我現在相信你不需要將目標表與源表連接並更新/插入目標表。由於它是目標表的內部聯接,這意味着您只匹配目標中存在的那些鍵。所以你可以直接把你的源表作爲主流而不需要與目的表連接,並且在輸出組件中只需選擇插入/更新選項。 – PreetyK

+0

你建議的這種方法是我的第一個設計。由於速度太慢,我不得不冒險尋找其他解決方案。 –