Создание набора данных с уникальными значениями индексированной переменной - PullRequest
0 голосов
/ 21 декабря 2018

У меня есть набор данных (LRG_DS) с примерно 74 000 000 наблюдений.Набор данных был проиндексирован переменной (I_VAR1), которая имеет около 7500 уникальных значений.Я обнаружил это, запустив содержимое proc в наборе данных.

Я хотел бы создать набор данных (TEMP), содержащий только 7000 уникальных значений переменной index.

Я пробовал следующее:

data TEMP; 
   set LRG_DS (keep = I_VAR1);  
   by I_VAR1;   
   if first.I_VAR1; 
   run;

и

proc sort data = LRG_DS nodupkey out = TEMP (keep = I_VAR1); 
   by I_VAR1;
   run;

Первый подход занимает около 46 секунд, а второй - около 55 секунд.

Я читал, что sas7bndx - это файл, предназначенный не для отдельного изучения, а скорее как файл для ускорения некоторых процедур, выполняемых с использованием переменной index.

Любая помощь очень ценится!

1 Ответ

0 голосов
/ 22 декабря 2018

YMMV, но использование заполнения пустой хеш-таблицы значениями уникальных ключей может работать лучше, чем сортировка.

Создайте некоторые примеры данных:

data x;
  do cnt=1 to 10*100000;
    var=round(rand('uniform'),0.001);
    do cnt2=1 to 10;
      output;
    end;
    drop cnt2;
  end;
run;

Скорость теста с proc sort:

proc sort data=x(keep=var) out=sorted nodupkey;
  by var;
run;

Сравнение с версией хеш-таблицы:

data _null_;

   set x(keep=var) end=eof;

   if _n_ eq 1 then do;
     declare hash ht ();
     rc = ht.DefineKey ('var');
     rc = ht.DefineDone ();
   end; 
   if ht.check() ne 0 then do;
     rc = ht.add();   
   end;
   if eof then do;
     ht.output(dataset:"ids");
   end;
run;

Из моих очень коротких тестов я обнаружил, что версия хеш-таблицы начинает работать хуже с ростом числа уникальных значений,Может быть возможно компенсировать это, предварительно определив размер хэша, но я не проверял.

...