Проблема производительности Clover ETL при обработке больших CSV-файлов с объединениями

Я использую инструменты CloverETL для чтения больших файлов CSV с более чем 100000 строк, перевода некоторых значений поиска из БД перед их вставкой в ​​таблицу БД.

В основном я использовал:

  1. Читатель плоского файла для чтения в файле
  2. Затем следует номер "Lookup Join" для перевода некоторых значений из БД.
  3. Затем ExtHashJoin, чтобы связать все данные (так как источник не отсортирован)
  4. Затем вставьте запись в БД.

Довольно простой процесс и отлично работает для небольшого количества записей. Но когда я пытаюсь импортировать весь файл, ему просто не хватает памяти (увеличение выделения памяти не поможет).

Я обнаружил, что ExtHashJoin пытается подождать, пока он не присоединится ко всем записям, прежде чем начинать их вставлять, и это, похоже, является проблемой, поскольку он должен хранить все записи в памяти. Мне действительно не нужно такое поведение. Все эти записи независимы и могут обрабатываться партиями, например, каждые 1000 строк за раз, но я не могу придумать, как это сделать так.

Я также попытался установить различные значения фаз, но он все еще пытается объединить все значения перед началом вставки первой записи.

Как я могу сказать программе чтения плоских файлов разбивать записи и обрабатывать их партиями?

Благодарю.

Эрик

1 ответ

Решение

Нет простого способа заставить компонент FlatFileReader разбивать записи и обрабатывать их партиями. Однако я могу предложить несколько советов, которые могут помочь вам решить проблему переполнения памяти, вызванную компонентом ExtHashJoin:

  1. Как вы правильно указали, компонент ExtHashJoin ожидает, пока все записи (из подчиненного порта) не поступят, прежде чем начнется присоединение. Как правило, мы рекомендуем использовать компонент ExtHashJoin, если число подключаемых записей подчиненного порта значительно меньше. Если бы это было не так, я бы рекомендовал использовать компонент ExtMergeJoin. Кэширование отсутствует (в отличие от ExtHashJoin), поэтому обработка может быть значительно быстрее. Для компонента ExtMergeJoin можно применить то же определение и отображение ключа Master / Slave, что и для компонента ExtHashJoin. Однако вам нужно будет разместить новый компонент ExtSort перед компонентом SimpleCopy на вашем графике, чтобы отправить отсортированные данные. Ключ сортировки должен совпадать с главным ключом, определенным в компоненте ExtMergeJoin.
  2. Если порядок сортировки ваших данных не изменяется при переходе от FlatFileReader к компоненту ExtHashJoin, возможно, существует даже более простой подход к снижению потребления памяти. Попробуйте заменить компонент ExtHashJoin новым компонентом Combine и применить то же сопоставление, что и для компонента ExtHashJoin. Компонент Combine также позволяет избежать кэширования записей, и нет необходимости в соединении по ключам, поэтому производительность должна быть достаточно хорошей.

Более подробную информацию по этой теме можно найти на форуме CloverETL: http://forum.cloveretl.com/viewtopic.php?p=12926

Другие вопросы по тегам