Вопрос

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

У меня есть программа, которая зацикливает и удаляет большое количество таблиц, и я хотел бы знать, есть ли разница в производительности между PROC SQL;и НАБОРЫ ДАННЫХ PROC;за удаление одной таблицы за раз..

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

Это было полезно?

Решение

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

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

Следующие два используют proc datasets.Первый создает оператор удаления для каждого набора данных, а затем удаляет.Второй просто выдает команду полного уничтожения, чтобы удалить все в рабочем каталоге.(Я ожидал, что этот метод будет самым быстрым).Обе процедуры набора данных сообщили, что на удаление всех 4000 файлов ушло около 20 секунд.

%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;

Другие советы

Я попытался поиграться с подходом удаления ОС.

Удаление с помощью 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 секунд, используя этот подход.

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

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

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

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

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

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

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

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

proc datasets; delete p1: ; run;

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top