SAS из-за ошибки памяти

Я получаю "Удаленному процессу не хватает памяти" в SAS DIS (Data Integration Studio):

Поскольку возможно, что мой подход неверен, я объясню проблему, над которой я работаю, и решение, которое я выбрал:

У меня есть большой список имен клиентов, которые нуждаются в очистке. Чтобы добиться этого, я использую файл.csv, содержащий шаблоны регулярных выражений и соответствующие им замены; (Я использую этот подход, поскольку легче добавить новые шаблоны в файл и загрузить его на сервер, чтобы развернутое задание могло считывать, а не разрабатывать новые правила и повторно развертывать задание).

Чтобы мой шаг данных использовал правила в файле, я добавляю шаблоны и их замены в массив на первой итерации шага данных, а затем применяю их к своим именам. Что-то вроде:

DATA &_OUPUT;

    ARRAY rule_nums{1:&NOBS} _temporary_;
    IF(_n_ = 1) THEN
        DO i=1 to &NOBS;
            SET WORK.CLEANING_RULES;
            rule_nums{i} = PRXPARSE(CATS('s/',rule_string_match,'/',rule_string_replace,'/i'));
        END;
    SET WORK.CUST_NAMES;
    customer_name_clean = customer_name;
    DO i=1 to &NOBS;
        customer_name_clean = PRXCHANGE(a_rule_nums{i},1,customer_name_clean);
    END;
RUN;

Когда я запускаю это на ~10K строках или меньше, оно всегда завершается и заканчивается очень быстро. Если я попытаюсь набрать ~15К строк, он будет задыхаться в течение очень долгого времени и в итоге выдает ошибку "Недостаточно памяти".

Чтобы попытаться справиться с этим, я построил цикл (используя преобразование цикла SAS DIS), в котором сначала я нумерую строки моего набора данных, а затем применяю предыдущую логику в пакетах по 10000 имен за раз. Через очень долгое время я получил ту же ошибку из-за недостатка памяти, но когда я проверил свою целевую таблицу (Teradata), я заметил, что она запускалась и загружала данные для всех, кроме последней итерации. Когда я переключил размер цикла с 10000 на 1000, я увидел точно такое же поведение.

В целях тестирования я работал только с ~500К строк, но скоро мне придется обрабатывать миллионы, и я беспокоюсь о том, как это будет работать. Для справки, набор правил очистки, который я применяю, в настоящее время составляет 20 строк, но может вырасти до нескольких сотен.

  • Значительно менее эффективно использовать файл с правилами, а не жестко кодировать регулярные выражения непосредственно в моем шаге данных?
  • Есть ли способ достичь этого без цикла?
  • Поскольку мой набор данных перезаписывается при каждой итерации цикла, как может возникнуть ошибка нехватки памяти для наборов данных длиной 1000 строк (и, например, 3 столбца)?
  • В конечном счете, как я могу решить эту ошибку нехватки памяти?

Спасибо!

1 ответ

Решение

Проблема оказалась в том, что журнал, который генерировало задание, был слишком большим. Возможные решения - отключить ведение журнала или перенаправить журнал в место, которое можно периодически очищать и / или на котором достаточно места.

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