Пытаюсь проиндексировать float-значение у всего-то двух миллионов записей:
При массированном прохождении по/создании некоторого глобала, неплохо бы известить систему об этом ужасном случае, чтобы она смогла оставить и другим процессам немного буферов глобалов "на жизнь". Делается это переводом процесса в пакетный режим при помощи утилиты ^%PRIO. Сделать это можно при помощи вызова
(малый приоритет, пакетный режим) или
(приоритет обычный, режим пакетный) В пакетном режиме процесс не может занять более 25% всех буферов глобалов. Что есть хорошо с точки зрения остальных задач.
Также при массированном заведении узлов большого дерева глобала имеет смысл заливать глобал уже отсортированным, для этого используется
$SortBegin переводит глобал в режим сортировки, и до вызова соответствующего $SortEnd ни одной записи такого глобала не будет записано реально в базу.
Они будут сортироваться в CACHETEMP (в памяти, если размера хватит) файлами по 1 МБ каждый. При вызове $SortEnd они будут сливаться в результирующий глобал одним проходом по этим файлам методом сортировки слиянием.
Примерчик смотрите в руководстве COS Language Reference - $SORTBEGIN.
Функции $SortBegin / $SortEnd принимают в качестве аргумента только имя глобальной переменной и не могут принять косвенность. В случае применения их в обобщенных функциях, где используются имена в виде строк, можно использовать xecute, например
Описание утилиты %PRIO:
http://www.intersystems.com/priordocexcerpts/prgaddlprogutils-41.pdf
Дмитрий Мартынов, Тимур Сафин, Евгений Каратаев по материалам фирмы Интерсистемс.
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
Дмитрий Мартынов, Тимур Сафин, Евгений Каратаев по материалам фирмы Интерсистемс.
Комментариев нет:
Отправить комментарий