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