SAS 9.4. DOSUBL Function.

Всем добрый день.

Среди сильных сторон версии SAS 9.4 в интернете указывается функция DOSUBL.

Давайте разберем что же в ней такого особенного.

На сайте support.sas.com дается следующее описание данной функции:

Функция позволяет импортировать макро переменные из вызываемой среды и экспортировать макро переменные обратно в вызываемую среду.

Для большей наглядности давайте все же рассмотрим на примерах, а еще лучше в сравнении с функцией CALL EXECUTE.

Для начала создадим макрос, который будет создавать макро переменную xyz (с помощью call symput) и присваивать ей значение передаваемое нашему макросу:










Далее приведу код программы с использованием функции CALL ECECUTE:
































  1. Сверху видно окончание кода макроса. 
  2. Далее с помощью %let создаем макро переменную xyz и присваиваем ей значение q.
  3. После чего идет data step шаг в котором с помощью функции call execute вызывается созданный нами макрос %doit с параметром aa.
  4. После переменной xyz_value присваивается значение макро переменной xyz с помощью функции symget.
  5. В конце выводим значение переменной xyz_value.
Как мы видим из лога значение переменной вывелось равным q.
Это произошло потому что код, который выводился с помощью функции call execute выполнился после выполнения основного шага data step.
В принципе это видно также из лога, но давайте это проверим:



















Действительно значение переменной изменилось на то, которое мы хотели, а именно на aa

Теперь давайте приведем тот же самый пример, только с использованием функции dosubl:

Здесь я не буду расписывать столь подробно, как предыдущий шаг.
Однако видно, что макро doit выполнился раньше основного шага data step, что привело к изменению макро переменной xyz.
Что мы и наблюдаем в логе, где переменной xyz_value выведено bb значение.
 Данный пример иллюстрирует полезность рассматриваемой нами функции DOSUBL.
P.S.
Когда искал информацию по функции dosubl наткнулся на следующую статью 
В принципе из нее и был взят пример. Однако что меня поразило, что эта функция появилась еще в версии 9.3. Тогда стоит вопрос, почему же ее начали расхваливать только с версии 9.4.
И я решил проверить, запустив данный пример на версии SAS 9.3:
И оказалось, что работает она совсем не так, как описано в статье, а точнее вообще не работает. 
Так что будьте внимательны.
Надеюсь данная статья была полезна для Вас.
С  уважением, 
Николай.


SAS 9.4. The Future is coming. Threads.

Всем добрый день!

Сегодня хотелось бы заглянуть в будущее и посмотреть что нас ждет через год или два.

А ждет нас конечно же еще один болезненный переход на новую версию SAS, а именно на 9.4 (ну конечно же если вы уже с 9.2 перешли на 9.3)

Честно говоря очень много изменений случилось в новой версии SAS, чтобы об всем рассказать и книги не хватит. Я бы даже сказал произошла некая небольшая революция. Можно было бы даже назвать версию сразу 10, но в SAS Institute видимо посчитали, что еще рано.

Ну так о новшествах: В SAS 9.4 появился новый язык DS2. Чем-то он может напоминать объектно-ориентированный, но не дотягивает до него. Однако обычные возможности Data Step сильно расширились. И видимо многим придется заново переучиваться или сильно доучиваться, чтобы начать писать свои программы на языке DS2. Я думаю что до этого пройдет еще не менее 2-3 лет. Как показывает практика от запада мы отстаем на 2 года, а там еще не начали во всю использовать этот язык.

И все же сегодня затронем тему параллельных вычислений. Как же все мы мечтали распараллелить наш data step последовательный код (по крайней мере я очень давно мечтал это сделать 🙂
И вот это свершилось теперь мы может распараллеливать наши вычисления.

Примеры:

Для начала создадим тестовую таблицу с 10 000 000 записей.

Затем создаем THREAD:

Теперь будет делать подсчет всех чисел от 1 до 10 000 000 в один поток:

Мы видим, что real_time практически идентичен cpu time и составляет почти 28 секунд.

Теперь выполним ту же задачу только в 8 потоков:

Из лога можно видеть, что реальное время работы программы уменьшилось до 7 секунд. А также работа cpu выросла до 50 секунд.

Теперь давайте решим эту задачу с помощью нашего обычного data step кода:

Мы видим, что результат практически идентичен работе нашей программы в один поток.

Ниже привожу результаты выполнения наших экспериментов:

Таблица T1 (формировалась в один поток):

Таблица Т8 (формировалась в 8 потоков):

И табличка которая получилась через data step код:

В общем и целом результат везде одинаков: 50 000 005 000 000 (сумма всех чисел от 1 до 10 миллионов).

P.S.
При написании статьи были использованы следующие материалы:

Надеюсь данная статья была полезна.
С уважением, 
Николай.

Что входит в Вашу лицензию SAS?

Всем доброго времени суток.

Иногда возникает вопрос при работе с продуктами SAS что входит в лицензию или например когда заканчивается срок действия лицензии.

Ответ на данный вопрос легко получить с помощью следующей команды:

После запуска данный команды увидим в логах необходимую нам информацию:

Также хочу обратить внимание, что если вы соберетесь обратиться в службу поддержки SAS, то Вам понадобиться Site number (его нужно указывать в самом начале письма либо в теме письма), который вы также сможете получить из данного лога.
С уважением,
Николай.