Проблемы с памятью и временем выполнения при копировании из Excel в SQL с использованием Talend

У меня есть простая задача копирования данных Excel в таблицы SQL. Сначала я выполняю одну хранимую процедуру для удаления записей в таблицах. Затем у меня есть ввод Excel, из которого я копирую данные в таблицы SQL, используя tMap.

У меня есть 20 таблиц для копирования данных. У меня относительно небольшое количество записей в таблице (10-100) для копирования. Тем не менее, когда я выполняю свою задачу, это занимает очень много времени (5-10 минут), и после копирования 12 записей в таблицах не хватает памяти.

Мой рабочий процесс .. (хранимая процедура -> (на подзадаче в порядке) -> ввод excel -> tmap -> tMSSqlOutput -> (в компоненте в порядке) -> ввод excel -> tmap -> tMSSqlOutput (в компоненте в порядке) -> ...... -> ввод excel -> tmap -> tMSSqlOutput)

Мой лист Excel находится на моем локальном компьютере, где я копирую данные в таблицы SQL на сервере. Я сохранил свои настройки запуска/отладки как Xms 1024M, Xmx 8192m. Но все равно не работает.

Могу ли я узнать, что я могу сделать, чтобы решить эту проблему?

Я запускаю свой талант на виртуальной машине (виртуальная машина). Прилагаю скриншот своей работы.

введите здесь описание изображения


person Quick-gun Morgan    schedule 02.06.2014    source источник
comment
Можете ли вы опубликовать скриншот вашей работы, пожалуйста?   -  person ydaetskcoR    schedule 02.06.2014
comment
Я отредактировал это в своем вопросе.   -  person Quick-gun Morgan    schedule 02.06.2014


Ответы (3)


Вы должны запускать все эти отдельные шаги в отдельных подзаданиях, используя "on subjob ok", чтобы связать их, чтобы сборщик мусора Java мог лучше перераспределять память между шагами.

Если это все еще не работает, вы можете разделить их на совершенно отдельные задания и связать их все с помощью компонентов tRunJob и обязательно установите флажок «Использовать независимый процесс для запуска подзадания»:

Использовать независимый процесс для запуска опции подзадания в tRunJob

Это создаст совершенно новый экземпляр JVM для процесса и, следовательно, не будет привязан к памяти JVM. Тем не менее, вы должны быть осторожны, чтобы не создавать слишком много экземпляров JVM, так как при запуске JVM будут некоторые накладные расходы, и, очевидно, вы все еще ограничены какими-либо ограничениями физической памяти.

На самом деле это отдельный вопрос, но вы также можете найти некоторую пользу от использования параллелизма в своей работе для повышения производительности.

person ydaetskcoR    schedule 02.06.2014
comment
Использование на подработке ok устранило проблемы со временем выполнения. Удалось скопировать 1500 строк за 2 минуты. Но я хотел знать, исправит ли это мои проблемы с памятью или нет? - person Quick-gun Morgan; 02.06.2014
comment
Единственный способ узнать - подождать и посмотреть, не закончится ли память, но я ожидаю, что он справится с этим нормально. Проблема, с которой вы столкнулись раньше, заключалась в том, что JVM хранила все данные для всех ваших таблиц Excel в памяти и не удаляла их, потому что ожидала, что вы вернетесь и получите к ним доступ позже. Поскольку это не так, вы должны явно использовать ссылку OK для подзадания. Вы должны использовать ссылку OK для компонента только тогда, когда вы явно хотите выполнить что-то, например, с фиксацией базы данных. - person ydaetskcoR; 02.06.2014
comment
Отлично. Спасибо за ваше ценное предложение. - person Quick-gun Morgan; 02.06.2014

Используйте onSubJobOK для excelInput, чтобы подключиться к следующему ExcelInput. Это изменило бы всю кодогенерацию.

Сгенерированный код — это функция для каждого подзадания. Разница в генерации кода между onSubJob и onComponentOk заключается в том, что OnComponent ok вызовет следующую функцию, а OnSubJobOk ожидает завершения текущего подзадания/функции. Последнее позволяет сборщику мусора работать лучше.

Если это не решит проблему, создайте подзадания, которые содержат 1 вывод excel-DB. Затем свяжите эти задания с OnSubjobOK в главном задании.

person Balazs Gunics    schedule 02.06.2014
comment
Я тоже просто набирал свой ответ на это :) Основная мысль верна, что эти подзадания должны быть связаны с подзаданием, но есть также ядерная опция для использования совершенно разных процессов, которые будут порождать новые экземпляры JVM. - person ydaetskcoR; 02.06.2014
comment
Использование на подработке ok устранило проблемы со временем выполнения. Удалось скопировать 1500 строк за 2 минуты. Но я хотел знать, исправит ли это мои проблемы с памятью или нет? - person Quick-gun Morgan; 02.06.2014

Чтобы избежать слишком большого потребления памяти заданием (outOfMemory), вы можете хранить большие преобразованные данные в своем tmap во временном каталоге на диске.

Этот принтскрин показывает, как это сделать.

введите здесь описание изображения

person amgohan    schedule 03.06.2014
comment
Это не проблема tMap. Также недостаточно указать там путь, но вам нужно включить хранилище для каждого поиска. - person Balazs Gunics; 04.06.2014