AW: [Python-Dev] segmentation fault with python2.3a0 from cvs

Gerson Kurz Gerson.Kurz@t-online.de
Mon, 7 Oct 2002 20:54:03 +0200


Gerson Kurz wrote

> Ok, here is a 55 bytes sourcecode:
>
> b = {}
> for i in range(1000000):
>     b[i] = [0] * 60
>
> --> segfault with cygwin.
>

as a follow up, here is an interesting behaviour when used with 2.3:

Python 2.3a0 (#29, Oct  7 2002, 19:54:53) [MSC 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> b = {}
[3319 refs]
>>> for i in range(1000000):
...     b[i]=[i]*60
...
[62003414 refs]
>>> for k in range(1000000):
...     del b[k]
...
[1003419 refs]
>>> print b[0]
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
KeyError: 0
[1003458 refs]
>>> print len(b.keys())
0
[1003621 refs]

The funny thing is, the memory allocated by python_d.exe *INCREASES* when I
do the del b[k]-bit thingy. OK, so I guess its time to do a gc:

>>> import gc
[1003753 refs]
>>> gc.collect()
0
[1003758 refs]
>>> gc.isenabled()
1
[1003758 refs]
>>>

Which frees up, like, nothing. Hm. When I do that with

PythonWin 2.2.1 (#34, Apr 15 2002, 09:51:39) [MSC 32 bit (Intel)] on win32.
...
>>> b = {}
>>> for i in range(100000):
... 	b[i] = [0] * 60
...
>>> for k in range(100000):
... 	del b[k]
...
>>>

(higher numbers throw MemoryException) I get a much more expected behaviour,
del b[k] frees up about 50% of the memory used (50 meg total), although
gc.collect() likewise has no measurable effect.