Удаление таблицы в SAS

Какой самый эффективный способ удалить таблицу в SAS?

У меня есть программа, которая выполняет цикл и отбрасывает большое количество таблиц, и мне хотелось бы узнать, есть ли разница в производительности между PROC SQL; и PROC DATASETS; для удаления одной таблицы за раз ..

Или, может быть, есть другой способ ???


person Allan Bowe    schedule 29.04.2009    source источник
comment
Вы могли просто удалить физические файлы таблиц SAS (и индексы) с помощью вызова операционной системы. Я понятия не имею, как это работает, но я ожидаю, что необработанное удаление файловой системы будет самым быстрым.   -  person Martin Bøgelund    schedule 29.04.2009


Ответы (6)


Если разумно передать на аутсорсинг ОС, это может быть быстрее всего. В противном случае мои ненаучные наблюдения показывают, что выпадающая таблица в proc sql является самой быстрой. Это меня удивило, так как я ожидал, что proc datasets будет самым быстрым.

В приведенном ниже коде я создаю 4000 фиктивных наборов данных, а затем пытаюсь удалить их все разными методами. Первый - с sql, и в моей системе для удаления файлов потребовалось около 11 секунд.

Следующие два используют proc datasets. Первый создает оператор удаления для каждого набора данных, а затем удаляет. Второй просто выдает команду blanket kill, чтобы удалить все в рабочем каталоге. (Я ожидал, что эта техника будет самой быстрой). Обе подпрограммы набора данных proc сообщили о 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;
person cmjohns    schedule 29.04.2009
comment
Как вы имеете в виду аутсорсинг для ОС? Вы имеете в виду через команду X? - person Allan Bowe; 29.04.2009
comment
Ага - и это кажется более быстрым, особенно если вы просто стираете весь каталог. Например - это удаляет все наборы данных sas из рабочего каталога с помощью команды x:% macro osdel; варианты noxwait; % let p =% sysfunc (путь (РАБОТА, l)); х дель & р. \ темп * .sas7bdat; % исправить; % osdel; - person cmjohns; 29.04.2009
comment
исправляя мой предыдущий комментарий - я хотел сказать, что он удаляет все наборы данных sas в рабочей папке, которые начинаются с temp (поскольку это был префикс, который я использовал в своем тесте в моем ответе). - person cmjohns; 29.04.2009
comment
Могу подтвердить ваши результаты, cmjohns. PROC SQL: 9-13 секунд. НАБОР ДАННЫХ ПРОЦЕССА (индивидуальный): 11-22 секунды. НАБОР ДАННЫХ ПРОЦЕССА (опция УБИЙСТВА): 20-29 секунд. - person Martin Bøgelund; 30.04.2009
comment
Как упоминалось в другом ответе, вам действительно стоит протестировать. Я предполагаю, что различия не обязательно связаны с подходом / proc, но больше связаны с конфигурацией системы и ОС. - person Jay Stevens; 30.04.2009
comment
Интересно, улучшит ли скорость добавление опции MEMTYPE = DATA к шагу PROC DATASETS? В данный момент у вас нет доступа к SAS, поэтому не могу проверить. +1 хоть за обстоятельный ответ! - person DavB; 12.07.2012
comment
Я подозреваю, что опция оператора удаления наборов данных proc будет намного быстрее, если вы удалите 4000 наборов данных в одном операторе удаления, а не по одному в каждом из 4000 операторов удаления. Кроме того, вы можете записать оператор удаления как delete temp:;, используя подстановочный знак: для сопоставления всех 4000 наборов временных данных. Дальнейшая оптимизация: запускать как с nowarn, так и с nolist. - person user667489; 19.07.2012

Я попытался возиться с методом удаления ОС.

Удаление с помощью X-команды не рекомендуется. Это заняло навсегда!

Затем я попытался использовать системную команду в шаге данных:

%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) расширяет их до списка, который затем становится слишком большим для его обработки ...

Программа в основном создает команду удаления для каждой из девяти файловых групп «temp [1-9] *. Sas7 *» и выдает эту команду.

Используя функцию создания макроса из ответа cmjohns для создания 4000 таблиц данных, я могу удалить их всего за 5 секунд, используя этот подход.

Как я и ожидал, прямое удаление операционной системы - это самый быстрый способ массового удаления.

person Martin Bøgelund    schedule 30.04.2009

Мы обсуждаем таблицы или наборы данных?

Таблицы подразумевают таблицы базы данных. Чтобы избавиться от них быстрым способом, самым быстрым способом будет использование функции передачи proc SQL. В частности, если вы можете подключиться к базе данных один раз и удалить все таблицы, отключитесь.

Если мы обсуждаем наборы данных в SAS, я бы сказал, что наборы данных proc sql и proc очень похожи. С точки зрения приложения, они оба выполняют одну и ту же дедукцию, чтобы создать системную команду, удаляющую файл. Все тесты, которые я видел в группах или презентациях пользователей SAS, всегда предполагали, что использование одного метода по сравнению с другим является маргинальным и основано на многих переменных.

Если крайне важно, чтобы у вас был самый быстрый способ отбросить наборы данных / таблицы, вам, возможно, придется его протестировать. Каждая установка и настройка SAS достаточно различаются, чтобы требовать тестирования.

person AFHood    schedule 29.04.2009

Что касается того, что быстрее, за исключением чрезвычайно больших данных, я готов поспорить, что между ними нет большой разницы. Однако при обработке постоянных наборов данных SAS я предпочитаю использовать PROC DATASETS, а не PROC SQL, просто потому, что мне легче управлять постоянными наборами данных, используя метод, разработанный SAS, а не реализацию SQL.

person user1519495    schedule 12.07.2012

Простое решение для временных таблиц с одинаковыми именами:

Если все ваши таблицы начинаются с одного и того же префикса, например p1_table1 и p1_table2, то следующий код удалит любую таблицу, начинающуюся с p1.

proc datasets; delete p1: ; run;

person simplesolution    schedule 13.05.2014

proc delete - еще одно, хотя и недокументированное, решение ..

http://www.sascommunity.org/wiki/PROC_Delete

person Allan Bowe    schedule 08.12.2009