title: Python: Memory leak debugging
body: <p>I have a small multithreaded script running in django and over time its starts using more and more memory. Leaving it for a full day eats about 6GB of RAM and I start to swap.</p>
  
  <p>Following <a href="http://www.lshift.net/blog/2008/11/14/tracing-python-memory-leaks" rel="noreferrer">http://www.lshift.net/blog/2008/11/14/tracing-python-memory-leaks</a> I see this as the most common types (with only 800M of memory used):</p>
  
  <pre><code>(Pdb)  objgraph.show_most_common_types(limit=20)
  dict                       43065
  tuple                      28274
  function                   7335
  list                       6157
  NavigableString            3479
  instance                   2454
  cell                       1256
  weakref                    974
  wrapper_descriptor         836
  builtin_function_or_method 766
  type                       742
  getset_descriptor          562
  module                     423
  method_descriptor          373
  classobj                   256
  instancemethod             255
  member_descriptor          218
  property                   185
  Comment                    183
  __proxy__                  155
  </code></pre>
  
  <p>which doesn't show anything weird. What should I do now to help debug the memory problems?</p>
  
  <p><em>Update:</em> Trying some things people are recommending. I ran the program overnight, and when I work up, 50% * 8G == 4G of RAM used. </p>
  
  <pre><code>(Pdb) from pympler import muppy
  (Pdb) muppy.print_summary()
                                       types |   # objects |   total size
  ========================================== | =========== | ============
                                     unicode |      210997 |     97.64 MB
                                        list |        1547 |     88.29 MB
                                        dict |       41630 |     13.21 MB
                                         set |          50 |      8.02 MB
                                         str |      109360 |      7.11 MB
                                       tuple |       27898 |      2.29 MB
                                        code |        6907 |      1.16 MB
                                        type |         760 |    653.12 KB
                                     weakref |        1014 |     87.14 KB
                                         int |        3552 |     83.25 KB
                      function (__wrapper__) |         702 |     82.27 KB
                          wrapper_descriptor |         998 |     77.97 KB
                                        cell |        1357 |     74.21 KB
    &lt;class 'pympler.asizeof.asizeof._Claskey |        1113 |     69.56 KB
                         function (__init__) |         574 |     67.27 KB
  </code></pre>
  
  <p>That doesn't sum to 4G, nor really give me any big data structured to go fix. The unicode is from a set() of "done" nodes, and the list's look like just random <code>weakref</code>s. </p>
  
  <p>I didn't use guppy since it required a C extension and I didn't have root so it was going to be a pain to build.</p>
  
  <p>None of the objectI was using have a <code>__del__</code> method, and looking through the libraries, it doesn't look like django nor the python-mysqldb do either. Any other ideas?</p>