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. 修改页面中所有TextBox控件的样式--CSS

    1.HTML <div> TextBox<br /> <input type="text" name="name" value=& ...

  2. .net平台是什么?.net平台的组成,.net平台的好处

    1..net(dotnet)平台是什么? .net平台是微软公司设计的一个用于开发各种应用的"框架"和程序的运行环境. 2..net平台的组成: a..net Framework( ...

  3. ViewFilpper

    package com.example.suneyaenews; import java.util.ArrayList; import java.util.HashMap; import java.u ...

  4. cookie保存分页参数

    <script src="../Public/js/jquery.cookie.js"></script> <script type="te ...

  5. gdb调试相关

    GDB调试及其调试脚本的使用返回脚本百事通一.GDB调试 1.1. GDB 概述 GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具.或许,各位比较喜欢那种图形界面方式的,像VC.BCB等 ...

  6. (收藏)KMP算法的前缀next数组最通俗的解释

    我们在一个母字符串中查找一个子字符串有很多方法.KMP是一种最常见的改进算法,它可以在匹配过程中失配的情况下,有效地多往后面跳几个字符,加快匹配速度. 当然我们可以看到这个算法针对的是子串有对称属性, ...

  7. UVA 10341 Solve It 解方程 二分查找+精度

    题意:给出一个式子以及里面的常量,求出范围为[0,1]的解,精度要求为小数点后4为. 二分暴力查找即可. e^(-n)可以用math.h里面的exp(-n)表示. 代码:(uva该题我老是出现Subm ...

  8. iOS原生App与H5页面交互笔记

    文/MikeZhangpy(简书作者)原文链接:http://www.jianshu.com/p/4ed3e5ed99c6著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 最近在做一个项 ...

  9. Oracle 游标疑问

    procedure1: CREATE OR REPLACE PROCEDURE UPDATE_AC02_AAE140_WYL(PI_AAB001 IN NUMBER, PO_FHZ OUT VARCH ...

  10. 五张图概括 什么是 ASP 、 ASP.NET (Web Pages,Web Forms ,MVC )

    当你看懂下面这五张图,我相信你对于学习.NET Web开发路线将不陌生!                                               来源: http://www.w3 ...