了解Python内存使用情况

时间:2017-08-14 13:29:03

标签: python memory

我的一个Python脚本存在轻微问题。它消耗了大量的驻留内存。这是一个240行的简单脚本。它将自己设置为RabbitMQ侦听器(pika),侦听请求以及何时接收它们,从数据库(SQLALchemy,psycopg2)查询数据并将其作为对Rabbit消息的响应进行未处理。它没有线程或任何其他噱头。

在相同的环境中,我运行了几个非常相似的脚本。我有另一个完全相同,它只返回一些不同的数据(并且是多线程的,它提供两个Rabbit连接,并通过第二个连接提供数据库写入功能)。

我的问题脚本是700-800 mb,大部分是驻留的,而运行良好的多线程脚本是300mb,有40mb驻留组件。在同一环境中运行的其他人通常为300mb / 20-40mb。

我在resouce,objgraph和pympler中添加了一些调试功能。它似乎根本没有增长,所以它似乎没有泄漏内存,在我看来,这些调试信息都没有增加到运行程序的巨大规模。

Memory usage 784160

function                      12439    +12439
tuple                          5044     +5044
dict                           4723     +4723
weakref                        3057     +3057
list                           2209     +2209
type                           1605     +1605
wrapper_descriptor             1413     +1413
getset_descriptor              1329     +1329
builtin_function_or_method     1086     +1086
set                             844      +844

                                          types |   # objects |   total size
=============================================== | =========== | ============
                                           dict |        4723 |      4.76 MB
                                            str |       25520 |      3.32 MB
                                           code |       11511 |      1.41 MB
                                           type |        1547 |      1.35 MB
                                        unicode |         716 |    682.61 KB
                                          tuple |        5044 |    387.59 KB
                                        weakref |        3058 |    262.80 KB
                                           list |        2209 |    252.50 KB
                                            set |         844 |    237.47 KB
  <class 'sqlalchemy.sql.visitors.VisitableType |         239 |    211.07 KB
                              collections.deque |         208 |    126.75 KB
                             wrapper_descriptor |        1418 |    110.78 KB
                            function (__init__) |         866 |    101.48 KB
                              getset_descriptor |        1332 |     93.66 KB
                     builtin_function_or_method |        1086 |     76.36 KB

我的问题是,这些数字看起来是否正常?如果他们这样做,我应该在哪里看下一个?当然我可以只为虚拟机添加内存,但由于所有其他脚本都运行得很好,具有相同的依赖关系(pika和sqlalchemy),我只是好奇它们中最简单的一个出了什么问题。

我下一步该去哪儿?主机是Ubuntu 16.04,带有Python 2.7.12。

0 个答案:

没有答案