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的内存问题的更多相关文章

  1. python3之模板pycurl探测web服务质量

    1.pycurl简介 pycURL是libcurl多协议文件传输库的python接口,与urllib模块类似,PycURL可用于从python程序中获取由URL标识的对象,功能很强大,libcurl速 ...

  2. 转python版本的curl工具pycurl学习

    一 pycurl介绍 pycurl模块为libcurl库提供了一个python接口.libcurl是一个开源免费且方便快捷的基于客户端的url传输库,支持FTP,HTTP,HTTPS,IMAP,IMA ...

  3. Zabbix使用Pycurl模块监控web页面状态

    由于网络的问题,zabbix自带web模块用不了,后台研发2b,老是更新正式环境安装包,导致一直出问题,老是给他们擦屁股,早说过这事,他们不配合,现在出问题了,挺爽,这锅我表示不背,就找了pycurl ...

  4. 故障重现(内存篇2),JAVA内存不足导致频繁回收和swap引起的性能问题

    背景起因: 记起以前的另一次也是关于内存的调优分享下   有个系统平时运行非常稳定运行(没经历过大并发考验),然而在一次活动后,人数并发一上来后,系统开始卡. 我按经验开始调优,在每个关键步骤的加入如 ...

  5. In-Memory:在内存中创建临时表和表变量

    在Disk-Base数据库中,由于临时表和表变量的数据存储在tempdb中,如果系统频繁地创建和更新临时表和表变量,大量的IO操作集中在tempdb中,tempdb很可能成为系统性能的瓶颈.在SQL ...

  6. In-Memory:内存优化表的事务处理

    内存优化表(Memory-Optimized Table,简称MOT)使用乐观策略(optimistic approach)实现事务的并发控制,在读取MOT时,使用多行版本化(Multi-Row ve ...

  7. 试试SQLSERVER2014的内存优化表

    试试SQLSERVER2014的内存优化表 SQL Server 2014中的内存引擎(代号为Hekaton)将OLTP提升到了新的高度. 现在,存储引擎已整合进当前的数据库管理系统,而使用先进内存技 ...

  8. 故障重现, JAVA进程内存不够时突然挂掉模拟

    背景,服务器上的一个JAVA服务进程突然挂掉,查看产生了崩溃日志,如下: # Set larger code cache with -XX:ReservedCodeCacheSize= # This ...

  9. 死磕内存篇 --- JAVA进程和linux内存间的大小关系

    运行个JAVA 用sleep去hold住 package org.hjb.test; public class TestOnly { public static void main(String[] ...

随机推荐

  1. 使用数据库绑定ListBox控件

    1. The HTML Markup <div> <asp:ListBox ID="ListBox1" runat="server">& ...

  2. Object lifetime

    Object lifetime Temporary object lifetime Storage reuse Access outside of lifetime Every object has ...

  3. win7安装 Apache2.2 PHP5.3 MySQL5.6

    . APACHE2.2    经典参考资料 http://blog.csdn.net/yousuosi/article/details/9859507 官方下载地址  http://mirror.bi ...

  4. VCC、VDD、VEE、VSS的区别

    电路设计以及PCB制作中,经常碰见电源符号:VCC. VDD.VEE.VSS,他们具有什么样的关系那? 一.解释 VCC:C=circuit 表示电路的意思, 即接入电路的电压 VDD:D=devic ...

  5. QT学习 之 文本文件读写

    上一章我们介绍了有关二进制文件的读写.二进制文件比较小巧,却不是人可读的格式.而文本文件是一种人可读的文件.为了操作这种文件,我们需要使用QTextStream类.QTextStream和QDataS ...

  6. android应用Dialog跳转到Activity

    public void back(Context context){ intent = new Intent(); intent.setClass(context, IBookActivity.cla ...

  7. 基于visual Studio2013解决C语言竞赛题之0305显示星期

     题目 解决代码及点评 这道题锻炼我们switch分支语句,对于条件太多时,用if符合条件分支是比较复杂的 可以使用switch代替 //5. 读入1到7之间的某个数,输出表示一星期中相应的 // ...

  8. 飘逸的python - 简单探索time模块

    time模块中方法众多,不过在了解本质和联系之后,就会发现其实很简单. 在python中可以用3种方式来表达时间.看似很乱,其实就只是这3种变来变去来回转换而已. 1.时间戳 2.时间tuple,由9 ...

  9. Dining(最大流)

    Dining Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 11844   Accepted: 5444 Descripti ...

  10. Erich Gamma

    Erich Gamma是IBM的杰出工程师.他是Jazz项目的领头人之一,曾担任Eclipse的Java开发环境JDT项目的领导,目前是Eclipse的项目管理委员会成员.Erich也是经典书籍< ...