Удаление таблицы в SAS
Что самое эффективное способ уронить таблицу в SAS?
У меня есть программа, которая зацикливает и отбрасывает большое количество таблиц и хотела бы знать, есть ли разница в производительности между proc SQL; и наборами данных PROC; для отбрасывания одной таблицы за раз..
или, может быть, есть другой способ???
6 ответов
если разумно аутсорсинг в ОС, это может быть самым быстрым. В противном случае мои ненаучные наблюдения, похоже, предполагают, что drop table in proc sql
самый быстрый. Это удивило меня, как я и ожидал.--2--> чтобы быть быстрым.
в приведенном ниже коде я создаю 4000 фиктивных наборов данных, а затем пытаюсь удалить их все различными методами. Первый - с sql, и в моей системе потребовалось около 11 секунд, чтобы удалить файлы.
следующие два используют proc datasets
. Первый создает инструкции delete для каждого набора данных, а затем удаляет. Второй просто выдает команду полного уничтожения, чтобы удалить все в рабочем каталоге. (Я ожидал, что этот метод будет самым быстрым). Обе процедуры proc datasets сообщили о 20 секундах для удаления всех 4000 файлов.
%macro create;
proc printto log='null';run;
%do i=1 %to 4000;
data temp&i;
x=1;
y="dummy";
output;run;
%end;
proc printto;run;
%mend;
%macro delsql;
proc sql;
%do i=1 %to 4000;
drop table temp&i;
%end;
quit;
%mend;
%macro deldata1;
proc datasets library=work nolist;
%do i=1 %to 4000;
delete temp&i.;
%end;
run;quit;
%mend;
%macro deldata2;
proc datasets library=work kill;
run;quit;
%mend;
option fullstimer;
%create;
%delsql;
%create;
%deldata1;
%create;
%deldata2;
Я попытался возиться с подходом OS-delete.
удаление с помощью команды X не рекомендуется. Это заняло навсегда!
затем я попытался с помощью системной команды в datastep:
%macro delos;
data _null_;
do i=1 to 9;
delcmd="rm -f "!!trim(left(pathname("WORK","L")))!!"/temp"!!trim(left(put(i,4.)))!!"*.sas7*";
rc=system(delcmd);
end;
run;
%mend;
Как вы можете видеть, мне пришлось разделить мои удаления на 9 отдельных команд удаления. Причина в том, что я использую подстановочные знаки"*", а базовая операционная система (AIX) расширяет их до списка, который затем становится слишком большим для него ручка...
программа в основном создает команду delete для каждой из девяти групп "темп[1-9]*.sas7*" и выдает команду.
используя функцию create macro из ответа cmjohns для создания 4000 таблиц данных, я могу удалить их всего за 5 секунд, используя этот подход.
таким образом, прямое удаление операционной системы-это самый быстрый способ массового удаления, как я и ожидал.
мы обсуждаем таблицы или наборы данных?
таблицы подразумевают таблицы базы данных. Чтобы избавиться от них быстрым способом, использование proc SQL pass-through facility будет самым быстрым. В частности, если вы можете подключиться к базе данных один раз и удалить все таблицы, а затем отключиться.
Если мы обсуждаем наборы данных в SAS, я бы сказал, что наборы данных proc sql и proc чрезвычайно похожи. С точки зрения приложения, они оба проходят через один и тот же вывод, чтобы создайте системную команду, которая удаляет файл. Все тесты, которые я видел в группах пользователей SAS или презентациях, всегда предполагали, что использование одного метода над другим является маргинальным и основано на многих переменных.
Если необходимо, чтобы у вас был абсолютный самый быстрый способ удалить наборы данных / таблицы, вам, возможно, придется его протестировать. Каждая установка и настройка SAS достаточно различна, чтобы гарантировать тестирование.
с точки зрения чего быстрее, исключая чрезвычайно большие данные, я бы поспорил, что между ними мало разницы. Однако при обработке постоянных наборов данных SAS мне нравится использовать наборы данных PROC, а не proc SQL, просто потому, что я чувствую себя лучше, манипулируя постоянными наборами данных с помощью метода SAS, а не реализации SQL
простое решение для временных таблиц, которые называются точно так же:
Если все ваши таблицы начинаются с одного префикса, например p1_table1 и p1_table2, то следующий код удалит любую таблицу, которая начинается с p1
proc datasets;
delete p1: ;
run;