powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Проблемы с рекурсией в Каше
16 сообщений из 16, страница 1 из 1
Проблемы с рекурсией в Каше
    #35597215
=Dimon=
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Натолкнулись на такую проблему в Cache' 5.2:
Рекурсивно перебираются глобалы, при 353 выполнении метода вылетает ошибка о переполнении стека.
Тестовый пример:
ClassMethod testRecurse(i As %Integer = 0) As %Integer
{
q:i>400 i
q ..testRecurse($I(i))
}

Что делать?
...
Рейтинг: 0 / 0
Проблемы с рекурсией в Каше
    #35597250
logist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет.

Замени рекурсию циклом.

=Сергей Шутов (logist)
ООО Димас, Хабаровск
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Проблемы с рекурсией в Каше
    #35597253
Dorandr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возможно по new каждый раз переменные определяете... Хотелось бы больше информации о методе, а то тут даже увеличения i нет
...
Рейтинг: 0 / 0
Проблемы с рекурсией в Каше
    #35597268
=Dimon=
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dorandr а то тут даже увеличения i нет

А $I(ххх) это простите что? :)
...
Рейтинг: 0 / 0
Проблемы с рекурсией в Каше
    #35597279
Dorandr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Опаньки... это ж инкремент, а мне показалось $length... Извиняйте, буквы похожи
...
Рейтинг: 0 / 0
Проблемы с рекурсией в Каше
    #35597280
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ренее в МСМ "глубину" стека нужно было задавать принудительно в СИСГЕНЕ... Т.е. если тебе мало значения по умолчанию - напиши сколько тебе нужно.
Правда такого количества итераций мы не делали...

А как это вы "рекурсивно перебираете" и для чего? Если не секрет конечно...
----------
Cache for Windows (x86-32) 2007.1.3 (Build 607) Wed Oct 17 2007 02:12:09 EDT
...
Рейтинг: 0 / 0
Проблемы с рекурсией в Каше
    #35599774
=Dimon=
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsaА как это вы "рекурсивно перебираете" и для чего? Если не секрет конечно...

Перебираю большое дерево в глобалах.
...
Рейтинг: 0 / 0
Проблемы с рекурсией в Каше
    #35599893
Turk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
=Dimon=Перебираю большое дерево в глобалах.
Как уже было сказано, стоит попробовать методы динамического программирования. С помощью $ORDER или $QUERY не пробовали реализовать?
...
Рейтинг: 0 / 0
Проблемы с рекурсией в Каше
    #35599961
=Dimon=
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Turk=Dimon=Перебираю большое дерево в глобалах.
Как уже было сказано, стоит попробовать методы динамического программирования. С помощью $ORDER или $QUERY не пробовали реализовать?
Именно так, и было сделано.
Ключ постоянно рекурсивно перебирался.
Переделали на цикл.
Но ИМХО сделать заглушку на 353 рекурсивных вызова, как-то уж слишком неправильно.
...
Рейтинг: 0 / 0
Проблемы с рекурсией в Каше
    #35600116
Фотография ну я
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
=Dimon=Turk=Dimon=Перебираю большое дерево в глобалах.
Как уже было сказано, стоит попробовать методы динамического программирования. С помощью $ORDER или $QUERY не пробовали реализовать?
Именно так, и было сделано.
Ключ постоянно рекурсивно перебирался.
Переделали на цикл.
Но ИМХО сделать заглушку на 353 рекурсивных вызова, как-то уж слишком неправильно.
В каше с максимальной глубиной рекурсии никогда не угадаешь. Расход стека зависит еще и от количества использованных new. Тут очевидно надо переделывать алгоритм. Нарветесь на ограничение не по одной причине так по другой.
...
Рейтинг: 0 / 0
Проблемы с рекурсией в Каше
    #35600405
=Dimon=
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну я
В каше с максимальной глубиной рекурсии никогда не угадаешь. Расход стека зависит еще и от количества использованных new. Тут очевидно надо переделывать алгоритм. Нарветесь на ограничение не по одной причине так по другой.
New не используется. Нарываться на костыли не хочется :)
...
Рейтинг: 0 / 0
Проблемы с рекурсией в Каше
    #35600453
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Framestack size
<FRAMESTACK>

В версии 2008.2DS.RC Ваш пример выполнился чуть с большими значениями:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
ClassMethod testRecurse1(i As %Integer =  0 ) As %Integer [ ProcedureBlock =  1  ]
{
q:i> 501  i
q ..testRecurse1($I(i))
}

ClassMethod testRecurse2(i As %Integer =  0 ) As %Integer [ ProcedureBlock =  0  ]
{
q:i> 821  i
q ..testRecurse2($I(i))
}
...
Рейтинг: 0 / 0
Проблемы с рекурсией в Каше
    #35600745
Alexey Maslov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
=Dimon=New не используетсяЭто Вам так кажется :) Параметры, передаваемые по значению, неявно "ньючатся", т.к. для них тоже создается кадр в стеке (как и для явно "заньюченных" переменных). Кстати, вспомнился давний совет по оптимизации программ: заменять
Код: plaintext
1.
new a
new b,c
на
Код: plaintext
1.
new a,b,c
Это связано с тем, что существует некий минимальный размер кадра стека, который отводится всегда (на несколько десятков переменных - точного значения не помню), поэтому, объединяя одиночные new в одну большую new, можно сэкономить память.
...
Рейтинг: 0 / 0
Проблемы с рекурсией в Каше
    #35602134
Sergei Obrastsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Maslov=Dimon=New не используетсяЭто Вам так кажется :) Параметры, передаваемые по значению, неявно "ньючатся", т.к. для них тоже создается кадр в стеке (как и для явно "заньюченных" переменных). Кстати, вспомнился давний совет по оптимизации программ: заменять
Код: plaintext
1.
new a
new b,c
на
Код: plaintext
1.
new a,b,c
Это связано с тем, что существует некий минимальный размер кадра стека, который отводится всегда (на несколько десятков переменных - точного значения не помню), поэтому, объединяя одиночные new в одну большую new, можно сэкономить память.
Ничего вы не сэкономите. Компилятор все-равно разобьет вашу 'new a,b,c' на 'new a new b new c'.
...
Рейтинг: 0 / 0
Проблемы с рекурсией в Каше
    #35603401
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ранее утверждали что экономия есть...
----------
Cache for Windows (x86-32) 2007.1.3 (Build 607) Wed Oct 17 2007 02:12:09 EDT
...
Рейтинг: 0 / 0
Проблемы с рекурсией в Каше
    #35603878
Alexey Maslov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergei ObrastsovКомпилятор все-равно разобьет вашу 'new a,b,c' на 'new a new b new c'.Скорее наоборот: он объединит 'new a new b new c' в 'new a,b,c', но лишь при условии, что команды находятся в одной строке (по кр. мере, в версиях до 2008.1 включительно). Простой пример подтверждает это:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
rec(x)
	s $zt="recerr",level= 0  s y=$$recfun(x) w y
	q
recfun(a)
	/*
	n b
	n c 
	n d
	n e
	n f
	n g
	n h
	n i
	n j
	n k
	n l
	// вариант 1*/
	//n b,c,d,e,f,g,h,i,j,k,l // вариант  2 
	n b n c n d n e n f n g n h n i n j n k n l // вариант  3 
	i $i(level) q:a= 1   1   q:a< 0   0 
	q a*$$recfun(a- 1 ) 	
recerr
	s $zt="" w !,$ze," ",level
	q
У меня вызов d rec(1000) в варианте 1 (каждая new в отдельной строке) вылетает с level=262, а в вариантах 2 и 3 - с level=480. Т.е. экономия от размещения всех new в одной строке есть и даже вполне ощутимая.
=
Cache for Windows (x86-32) 2008.1 (Build 401_0_6608) Thu Apr 3 2008 01:55:03 EDT
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Проблемы с рекурсией в Каше
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]