码迷,mamicode.com
首页 > Web开发 > 详细

pycURL的内存问题

时间:2016-04-30 06:30:57      阅读:162      评论:0      收藏:0      [点我收藏+]

标签:

pycURL的内存问题

最近用pycURL写了一个工具,注册账号用的。写是写好了,但是发现内存占用超大。40个线程运行一天跑到了3.7G的内存。

于是着手调查这个问题。

调查方法就是用python的gc啦。

关于python gc的特性神马的我就不赘述了,google都能搜到一大坨。

最后是发现pycURL的使用中的一个地方导致了循环引用,再加上我写了析构方法,于是就杯具了。。

 

def __init__(self):

   ...

   self._crawler       = pycurl.Curl()

   ...

   self._crawler.setopt(pycurl.WRITEFUNCTION, self._get_res)

   ...

 

def __del__(self):

   self._crawler.close()

 

def _get_res(self, data):

   self._response += data

 

就是这样。。于是就好了。。这个类引用的pycurl.Curl对象,pycurl.Curl对象又引用了这个类里的_get_res方法。。。

破解这个循环也不是很方便就可以的,最后还是用了在perform前指定局部变量

def visit(self, ...):

    b = StringIO.StringIO()

    self._crawler.setopt(pycurl.WRITEFUNCTION, b.write)

    ...

    self._crawler.perform()

    self._response = b.getvalue()

    ...

 

-.-

 

比较一下

 

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
13020 huang.sh  15   0 5821m 3.7g 4784 S  0.0 47.3   3:22.22 /usr/local/bin/python2.6 -O -m captcha.regmachine.register

 

上面是优化前的运行状况,40线程

 

下面是优化后的运行状况,50线程

 

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
21702 huang.sh  15   0  953m 112m 4776 S  0.0  1.4   3:34.11 /usr/local/bin/python2.6 -O -m captcha.regmachine.register

 

pycURL的内存问题

标签:

原文地址:http://www.cnblogs.com/destim/p/5448021.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!