Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to release used memory immediately in python list?

Tags:

python

in many cases ,you are sure you definitely won't use the list again,i hope the memory should be release right now

a = [11,22,34,567,9999] del a 

i'm not sure if it really release the memory,you can use

del a[:] 

that actually remove all elements in list a .

so the best way to release is this?

def realse_list(a):    del a[:]    del a 

not quite sure.need your opinion.

btw,how about tuple and set?

like image 458
Max Avatar asked Sep 14 '12 02:09

Max


People also ask

How do you release a memory from a list in Python?

The effect of the clear() method is that the list is now empty. In theory, you released the Python virtual machine from the burden of keeping the elements in the memory. Python uses reference counting to determine if some elements in the memory are not referenced anymore (and, thus, can be considered unused).

How do I clear Python memory usage?

to clear Memory in Python just use del. By using del you can clear the memory which is you are not wanting. By using del you can clear variables, arrays, lists etc.

How is memory freed in Python?

Python Garbage Collection As explained earlier, Python deletes objects that are no longer referenced in the program to free up memory space. This process in which Python frees blocks of memory that are no longer used is called Garbage Collection.

Why does Python not release memory?

Unlike many other languages, Python does not necessarily release the memory back to the Operating System. Instead, it has a dedicated object allocator for objects smaller than 512 bytes, which keeps some chunks of already allocated memory for further use in the future.


2 Answers

def release_list(a):    del a[:]    del a 

Do not ever do this. Python automatically frees all objects that are not referenced any more, so a simple del a ensures that the list's memory will be released if the list isn't referenced anywhere else. If that's the case, then the individual list items will also be released (and any objects referenced only from them, and so on and so on), unless some of the individual items were also still referenced.

That means the only time when del a[:]; del a will release more than del a on its own is when the list is referenced somewhere else. This is precisely when you shouldn't be emptying out the list: someone else is still using it!!!

Basically, you shouldn't be thinking about managing pieces of memory. Instead, think about managing references to objects. In 99% of all Python code, Python cleans up everything you don't need pretty soon after the last time you needed it, and there's no problem. Every time a function finishes all the local variables in that function "die", and if they were pointing to objects that are not referenced anywhere else they'll be deleted, and that will cascade to everything contained within those objects.

The only time you need to think about it is when you have a large object (say a huge list), you do something with it, and then you begin a long-running (or memory intensive) sub-computation, where the large object isn't needed for the sub-computation. Because you have a reference to it, the large object won't be released until the sub-computation finishes and then you return. In that sort of case (and only that sort of case), you can explicitly del your reference to the large object before you begin the sub-computation, so that the large object can be freed earlier (if no-one else is using it; if a caller passed the object in to you and the caller does still need it after you return, you'll be very glad that it doesn't get released).

like image 158
Ben Avatar answered Sep 19 '22 09:09

Ben


As @monkut notes, you probably shouldn't worry too much about memory management in most situations. If you do have a giant list that you're sure you're done with now and it won't go out of the current function's scope for a while, though:

del a simply removes your name a for that chunk of memory. If some other function or structure or whatever has a reference to it still, it won't be deleted; if this code has the only reference to that list under the name a and you're using CPython, the reference counter will immediately free that memory. Other implementations (PyPy, Jython, IronPython) might not kill it right away because they have different garbage collectors.

Because of this, the del a statement in your realse_list function doesn't actually do anything, because the caller still has a reference!

del a[:] will, as you note, remove the elements from the list and thus probably most of its memory usage.

You can do the_set.clear() for similar behavior with sets.

All you can do with a tuple, because they're immutable, is del the_tuple and hope nobody else has a reference to it -- but you probably shouldn't have enormous tuples!

like image 25
Danica Avatar answered Sep 19 '22 09:09

Danica