Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

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

Следующие два варианта используют proc datasets. Первый создает оператор удаления для каждого набора данных, а затем удаляет. Второй просто вызывает команду killet для удаления всего в рабочем каталоге. (Я ожидал, что этот метод будет самым быстрым). Обе процедуры 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;

Ответ 2

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

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

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

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

Ответ 3

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

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

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

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

Ответ 4

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

Ответ 5

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

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

proc datasets; delete p1: ; run;