memory leak with large list??

Skip Montanaro skip at pobox.com
Sat Jan 25 00:33:28 CET 2003


    >> %MEM  RSS  RSS    SZ   VSZ
    >> 46.2 237648 237648 59690 238760

    >> So then delete it.

    >>>> del(big_list)

    >> But the memory footprint of the process remains very large:

    >> %MEM  RSS  RSS    SZ   VSZ
    >> 37.1 190772 190772 47971 191884

    >> Is python leaking memory, or is there something else going on here.

No, this is your platform's malloc() library not returning memory to the
operating system.

    >> I should note, if I just preallocate the list with 0.0:

    >>>> big_list = [0.0] * 12000000

    >> and then delete it, I don't see the leak, but then memory footprint is
    >> smaller than you would expect
    >> from 12 million floats:

    >> %MEM  RSS  RSS    SZ   VSZ
    >>  9.4 48700 48700 12453 49812

    >> So I think python is using a shortcut in this case.

Yes.  a float for 0.0 is allocated once, then referred to from all those
slots.  Consider this example:

    >>> list1 = [0.0] * 5
    >>> list2 = [float(0) for f in xrange(5)]
    >>> list1
    [0.0, 0.0, 0.0, 0.0, 0.0]
    >>> list2
    [0.0, 0.0, 0.0, 0.0, 0.0]
    >>> list1 == list2
    True
    >>> map(id, list1)
    [6355924, 6355924, 6355924, 6355924, 6355924]
    >>> map(id, list2)
    [6355860, 6355908, 6355892, 6355876, 6355844]

Skip





More information about the Python-list mailing list