Может можно как-то принудительно вызвать сборку мусора? Тогда добавить счётчик итераций и каждую скажем 100-тысячную вызывать сборку мусора.
Ну так я принудительно и попробовал, просто сверяя текущий размер стека с половиной от максимального.
#define my_gc_needed(av,n) (avma < (pari_sp)stack_lim(av, n))
Ну вернее не с половиной а с какой-то долей, определяемой параметром n, при n=1 с 1/2; при n=2 с 1/4 и т.п.
Я поставил 1, то есть с половиной.
Но это требует редактирования Си кода и перекомпиляции, что канеш такое себе...
Но вообще, можно и на каждой итерации собирать мусор, если просто убрать/закомментировать строчку 30 тут:
Код:
30 if (gc_needed(btop, 1))
31 gerepileall(btop, 2, &n, &k);
будет немного медленнее (зависит от "тяжести" тела цикла).
gerepileall перемещает переменные (в примере выше n и k) в кучу, очищает стек, вовращает переменные из кучи в начало стека и очищает от них кучу. Но если тело цикла "тяжелое" то накладных расходов не много.