У нас достаточно большой набор данных (около 700 ГБ), который находится в библиотеке SPDE и содержит параметр SORTEDBY. К сожалению, кажется, что эта опция вызывает значительное снижение производительности и похоже, что по умолчанию она возвращается к использованию одного потока.
Есть ли способ переопределить это, чтобы заставить SAS использовать максимальное количество потоков ЦП для чтения этого набора данных? Порядок сортировки не важен для моих целей. Я посмотрел на параметр SPDSEV2T на http://support.sas.com/documentation/cdl/en/spdsug/67140/HTML/default/viewer.htm#n1fru1udmbaf6xn1ta8u681lp6fu.htm, но документация плохая и, похоже, ничего не делает.
Обратите внимание, что мы используем SAS 9.4.
Также обратите внимание, что это набор производственных данных, поэтому он не может перезаписать / заменить исходную таблицу, то есть он сжат в формате BINARY.
Заранее спасибо
Ниже приведен пример со статистикой и кодом:
Таблица содержит 300 миллионов строк и 870 столбцов. Размер таблицы составляет 823 ГБ с использованием сжатия CHAR. Размер таблицы составляет 638 ГБ с использованием сжатия BINARY
Шаг данных, приведенный ниже, занимает 1 час 30 минут с использованием таблицы сжатия BINARY. Похоже, что производительность в Gimped объясняется переходом в однопоточный режим по какой-то странной причине. Скорость чтения с диска = 50 МБ / с
Следующий шаг данных занимает 14 минут с использованием таблицы сжатия CHAR. Все процессоры активны на этом этапе. Скорость чтения с диска = 1000 МБ / с
При использовании fullstimer была разница между двумя методами сжатия. BINARY имеет «Операции ввода блока = 0», в то время как CHAR имеет «Операции ввода блока = 7616». Однако не уверен, что это что-то значит.
libname hs2 SPDE '/work/saswork/spde';
DATA table1 (KEEP=cp b pl ii ex exy fred sta n ee qwe ver pot gr pcr burb)
table3 (KEEP=b pt cl sb n sd ed yt ta cl sb cp pcr burb)
table2 (KEEP=b pt cl sb n sd ed yt ta cl sb cp pcr burb);
SET hs2.bigtable_char (
KEEP=cp b pl ii ex exy fred sta n ee qwe ver poy gr pcr burb
pt cl sb sd ed yt ta
WHERE=(cl= 'YTR' and sb = 'IYU' and cp in (2,47,101,45)));
IF (sd <= "&end."d <= ed AND ti /*ti is a numeric variable*/ AND ta not in ('A' 'B' 'C')) THEN OUTPUT table3;
IF (sd <= "&middle."d <= ed AND ti AND ta not in ('A' 'B' 'C')) THEN OUTPUT table2;
IF (fred >= "&start."d and fred <= "&end."d) THEN OUTPUT table1;
RUN;