Karim BELABAS on Mon, 8 Jun 1998 13:00:34 +0200


[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]

Re: "kill" and deallocating memory in GP.


Matias Atria <matria@abello.dic.uchile.cl> wrote:
> I've found that the 'kill' function is almost unusable in recent versions
> of PARI. After using it a couple of times I get a segment violation
> forcing me to restart GP and loosing all the computations I've done
> before. Is this a well known problem? Is there a fix? I can provide more
> information about the situation if necessary.

I definitely would like more information (a minimal script that exhibits
the bug for instance).

> Also, one of the reasons I use 'kill' so much is to make GP free some
> memory. I have to compute matrices with several thousand entries and dump
> them imediately to a file, so I don't need them to be held in memory for
> too long (and I can't allocate too many megs for the PARI stack). Is
> there a cleaner way of doing this? I'm not even sure the 'kill' function
> deallocates any memory from the stack. Can one of the PARI gurus please
> enlighten me?

Picture it this way: the "stack" is the scratchboard used by all library
functions for their computations. The "heap" (disjoint from the stack) is
the permanent storage: history entries (%1, %2, ...), variable values,
clones , some constants (0, 1, ...).                  ^^^^^^^^^^^^^^^ 

kill destroys a variable value (and the variable itself), so does not
affect the stack in any way. Your stack overflows for some other reasons.
The heap grows very slowly and, unless you install() some badly written
custom modules (creating a lot of clones for instance), should not be a
problem (you can also lower histsize if your intermediate results are
huge).

Stack is emptied each time a new prompt is printed, but actually grows
during the execution of a script line. You might try to add some 
print(getheap) statements within you script, and set memory debug level to
at least 2 (type \gm 2). You get much more information is you use the
debugging version produced after a Configure -g, but you might already see
something.

Hope this helps,

  Karim.

P.S: kill is meant to remove an annoying symbol from the hashtables (see
user's manual): say

(18:40) gp > f=1
%1 = 1
(18:40) gp > f()=
  ***   unused characters: f()=
                            ^--
(f is remembered as a variable: impossible to use it as a function name)
(18:40) gp > kill(f)
(18:41) gp > f()= \\ ok now !

If you think the value of f take too much room, just type e.g f = 0. This
will destroy the old value and replace it with something small.

Note: each time f is given as a parameter for a user's function, a copy
is made, which is not destroyed by f = 0 as above (that's PARI's idea of
local variables). As a rule one should avoid passing huge objects as
parameters. Use global variables for that...

Besides, killing a variable has the annoying side effect of permanently
removing a variable number (from a list of MAXVARN = 16383 entries on
32-bit systems):

(18:42) gp > while(1,kill(y))
  ***   no more variables available: while(1,kill(y))
                                             ^-------
(after one or two seconds).
(18:43) gp > length(reorder)
%2 = 16382
(that many variables have been used...)

This behaviour is the simplest solution to the following problem: how do we
handle objects using a killed variable

Note 2: "x" is a special case: it's the only variable that is created upon
startup, and is never actually killed: while (1, kill(x)) initiates an
infinite loop.
--
Karim Belabas                    email: Karim.Belabas@math.u-psud.fr
Dep. de Mathematiques, Bat. 425
Universite Paris-Sud             Tel: (33 1) 01 69 15 57 48
F-91405 Orsay (France)           Fax: (33 1) 01 69 15 60 19
--
PARI/GP Home Page: http://pari.home.ml.org