zoukankan      html  css  js  c++  java
  • pycURL的内存问题

    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

     
  • 相关阅读:
    Putty完全使用方法
    TCP端口扫描
    XSS学习笔记
    SQL漏洞学习笔记
    Codeforces Round #263 (Div. 1)
    hdu4987A simple probability problem.(凸包)
    Codeforces Round #262 (Div. 2)
    hdu3228Island Explorer
    hdu2297Run(凸包的巧妙应用)
    poj3301Texas Trip(三分)
  • 原文地址:https://www.cnblogs.com/timssd/p/5448021.html
Copyright © 2011-2022 走看看