Как повторно использовать хеш-таблицу в SAS - PullRequest
0 голосов
/ 07 июня 2018

У меня есть много large_tables (миллиарды строк), которые я хочу разместить на основе id_list (миллионы строк).Я использую хеш-таблицу, чтобы ускорить ее:

data subset1;
    set large_table1;
    if _n_ eq 1 then do;
        declare hash ht(dataset:"id_list");
        ht.definekey('id');
        ht.definedone();
    end;
    if ht.check() eq 0 then do; output; end;
run;

Как я могу использовать хеш-таблицу id_list?Воссоздание его в каждом запросе подмножества тратит слишком много времени.

Обновление: Как показано в ответах, в настоящее время нет обходного пути для создания постоянных хеш-таблиц в SAS.Я тестировал эмпирически два менее оптимальных варианта с 12-миллионными строками id_list и 1,5 млрд. Строк large_table.Использование формата вместо хеш-таблицы заняло почти вдвое больше времени (40 минут против 23 минут).Это уменьшает затраты на воссоздание хеш-таблицы на каждом шаге данных, поэтому я пока просто сделаю это.

Ответы [ 4 ]

0 голосов
/ 15 июня 2018

Вы также можете загрузить меньший набор данных в память, используя оператор SASFILE.

http://documentation.sas.com/?docsetId=lestmtsglobal&docsetTarget=n0osyhi338pfaan1plin9ioilduk.htm&docsetVersion=9.4&locale=en

Это будет ускорять загрузку каждый раз, как при загрузке из памяти впамять, а не с диска в память ...

0 голосов
/ 08 июня 2018

для полноты;вот как вы бы повторно использовали хеш: используя FCMP.Она не использует таблицу на шаге данных (она повторно загружает хэш-таблицу), но в макросе она сохраняется.

proc fcmp outlib=work.funcs.func;
function check_ids( name $ );
 declare hash h_ids(dataset:"work.class_names");
 rc = h_ids.defineKey( "name");
 rc = h_ids.definedone();
 rc = h_ids.check();
 return( not rc );
endsub;

quit;

data class_names;
  set sashelp.class;
  where sex='F'; 
run;

 options cmplib=work.funcs;

data class_find_f;
   set sashelp.class;
   if check_ids(name)=1;
run;

См. Хеширование в PROC FCMP для улучшенияВаша производительность для более подробной информации о хешировании в FCMP.

0 голосов
/ 08 июня 2018

К сожалению, хеш-таблицы не могут сохраняться на всех этапах DATA.AFAIK, когда шаг заканчивается, они стираются, чтобы освободить память.Я видел выступление Арт Карпентера на SGF 2018, где он пробовал разные способы заставить SAS создать постоянную хеш-таблицу и не смог добиться успеха.

https://www.sas.com/content/dam/SAS/support/en/sas-global-forum-proceedings/2018/2399-2018.pdf

0 голосов
/ 07 июня 2018

Я бы сделал это не с использованием хеш-таблицы, а с использованием format.

data for_fmt;
  set id_list;
  retain fmtname 'idlistf' type 'n'; *or c if id is character, and add $ to fmtname;
  start=id;
  label=1;
  output;
  if _n_=1 then do;  *this section we tell it what to do with 'other' (not found) IDs;
    hlo='o';
    call missing(start); *unneeded but I like to do this for clarity;
    label=0;
    output;
  end;
run;

*if ID can be duplicated, then run a proc sort nodupkey here;

proc format cntlin=for_fmt;
run;

Это сохраняется и должно быть так же быстро, как ваша хэш-таблица.Если ваш список идентификаторов очень большой, вы можете использовать view здесь и обрабатывать его только один раз.

...