[Tutor] memory error files over 100MB

A.T.Hofkamp a.t.hofkamp at tue.nl
Tue Mar 17 11:34:50 CET 2009


Kent Johnson wrote:
> On Mon, Mar 16, 2009 at 12:30 PM, A.T.Hofkamp <a.t.hofkamp at tue.nl> wrote:
> 
>> I don't know what code is executed in an assignment exactly, but
>> **possibly**, first the 'read()' is executed (thus loading a very big string
>> into memory), before assigning the value to the variable (which releases the
>> previous value of the variable).
>> That means that just after reading but before assigning, you **may** have
>> two very big strings in memory that cannot be garbage collected.
> 
> No. Python variables are references to values, not containers for
> values. Python assignment is *always* reference assignment, not
> copying of a value. More here;
> http://personalpages.tds.net/~kent37/kk/00012.html

Nice web-page!



I am aware of how variables are treated in Python.
Let me explain my reasoning in more detail. Consider the statement

s = s + "def"

under the assumption that s is now "abc" (or rather, s references the data 
value "abc").

For the assignment, I believe the following happens inside the python 
interpreter (but I am not 100% sure that it is exactly the sequence):

1. get a reference to the current value of s.
2. get a reference to the constant value "def".
3. compute the new value "abcdef", store it in memory, and make a reference to it.
4. drop the old reference of s (thus free-ing "abc")
5. give s a reference to the newly computed value.


The point I was trying to make is that after step 3 and before step 4, the old 
value of s is still referenced by s, and the new value is referenced 
internally (so step 5 can be performed).
In other words, both the old and the new value are in memory at the same time 
after step 3 and before step 4, and both are referenced (that is, they cannot 
be garbage-collected).

Assuming that the above mechanism is used with all assignments, this will also 
  be the case in the sequence of assignments

s = read()
# write s
s = read()
# write s

where in the second assignment statement, the read() is done (creating the new 
value in memory) before dropping the value of s from the first assignment.

You can do the above statements also iteratively of course

for i in ...
   s = read()
   # write s

but since the loop does nothing with either s or read(), this will not change 
how the assignment works.


In the case that you are manipulating large values (as in taking a lot of 
computer memory for each value), the execution of the read() during step 3 may 
fail due to memory being used for the previously assigned value of s.


Sincerely,
Albert




More information about the Tutor mailing list