четверг, 7 апреля 2016 г.

Cache': Торможение при индексировании

Пытаюсь проиндексировать float-значение у всего-то двух миллионов записей:
f i=1:1:2000000 d
. s ^A4Test("I",$r(1000000)/100,i)=""
. w:'(i#10000) i,!
До 790000 процесс идет достаточно шустро, после чего производительность катастрофически падает (4.1.10 и 5.0). Это лечится? Есть какие-нибудь рекомендации по этому поводу?

При массированном прохождении по/создании некоторого глобала, неплохо бы известить систему об этом ужасном случае, чтобы она смогла оставить и другим процессам немного буферов глобалов "на жизнь". Делается это переводом процесса в пакетный режим при помощи утилиты ^%PRIO. Сделать это можно при помощи вызова

> D LOW^%PRIO

(малый приоритет, пакетный режим) или

> D SETPRIO^%PRIO("NORMAL,BATCH")

(приоритет обычный, режим пакетный) В пакетном режиме процесс не может занять более 25% всех буферов глобалов. Что есть хорошо с точки зрения остальных задач.

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

$SortBegin / $SortEnd

$SortBegin переводит глобал в режим сортировки, и до вызова соответствующего $SortEnd ни одной записи такого глобала не будет записано реально в базу.

Они будут сортироваться в CACHETEMP (в памяти, если размера хватит) файлами по 1 МБ каждый. При вызове $SortEnd они будут сливаться в результирующий глобал одним проходом по этим файлам методом сортировки слиянием.

Примерчик смотрите в руководстве COS Language Reference - $SORTBEGIN.

Функции $SortBegin / $SortEnd принимают в качестве аргумента только имя глобальной переменной и не могут принять косвенность. В случае применения их в обобщенных функциях, где используются имена в виде строк, можно использовать xecute, например

USER>s name=$na(^index("abc"))
USER>x "s res=$SortBegin("_na_")"
...
USER>x "s res=$SortEnd("_na_")"

Описание утилиты %PRIO:
http://www.intersystems.com/priordocexcerpts/prgaddlprogutils-41.pdf

Дмитрий Мартынов, Тимур Сафин, Евгений Каратаев
по материалам фирмы Интерсистемс. 

Комментариев нет:

Отправить комментарий