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
pycURL的内存问题的更多相关文章
- python3之模板pycurl探测web服务质量
1.pycurl简介 pycURL是libcurl多协议文件传输库的python接口,与urllib模块类似,PycURL可用于从python程序中获取由URL标识的对象,功能很强大,libcurl速 ...
- 转python版本的curl工具pycurl学习
一 pycurl介绍 pycurl模块为libcurl库提供了一个python接口.libcurl是一个开源免费且方便快捷的基于客户端的url传输库,支持FTP,HTTP,HTTPS,IMAP,IMA ...
- Zabbix使用Pycurl模块监控web页面状态
由于网络的问题,zabbix自带web模块用不了,后台研发2b,老是更新正式环境安装包,导致一直出问题,老是给他们擦屁股,早说过这事,他们不配合,现在出问题了,挺爽,这锅我表示不背,就找了pycurl ...
- 故障重现(内存篇2),JAVA内存不足导致频繁回收和swap引起的性能问题
背景起因: 记起以前的另一次也是关于内存的调优分享下 有个系统平时运行非常稳定运行(没经历过大并发考验),然而在一次活动后,人数并发一上来后,系统开始卡. 我按经验开始调优,在每个关键步骤的加入如 ...
- In-Memory:在内存中创建临时表和表变量
在Disk-Base数据库中,由于临时表和表变量的数据存储在tempdb中,如果系统频繁地创建和更新临时表和表变量,大量的IO操作集中在tempdb中,tempdb很可能成为系统性能的瓶颈.在SQL ...
- In-Memory:内存优化表的事务处理
内存优化表(Memory-Optimized Table,简称MOT)使用乐观策略(optimistic approach)实现事务的并发控制,在读取MOT时,使用多行版本化(Multi-Row ve ...
- 试试SQLSERVER2014的内存优化表
试试SQLSERVER2014的内存优化表 SQL Server 2014中的内存引擎(代号为Hekaton)将OLTP提升到了新的高度. 现在,存储引擎已整合进当前的数据库管理系统,而使用先进内存技 ...
- 故障重现, JAVA进程内存不够时突然挂掉模拟
背景,服务器上的一个JAVA服务进程突然挂掉,查看产生了崩溃日志,如下: # Set larger code cache with -XX:ReservedCodeCacheSize= # This ...
- 死磕内存篇 --- JAVA进程和linux内存间的大小关系
运行个JAVA 用sleep去hold住 package org.hjb.test; public class TestOnly { public static void main(String[] ...
随机推荐
- SSIS CDC(Change Data Capture)组件在数据库中启用报错。 The error returned was 14234: 'The specified '@server' is invalid
昨天实验CDC,在数据库中执行以下语句的时候出错. EXEC sys.sp_cdc_enable_table @source_schema = N'stg', @source_name = N'CDC ...
- 两台linux机器时间同步
Linux自带了ntp服务 -- /etc/init.d/ntpd,这个服务不仅可以设置让本机和某台/某些机器做时间同步,他本身还可以扮演一个time server的角色,让其他机器和他同步时间. 配 ...
- asp.net core+ef core
asp.net core+ef core 官方的文档https://docs.asp.net/en/latest/tutorials/first-mvc-app/start-mvc.html 先来看一 ...
- Agile methodology
ntroduction Waterfall model follows application development in phases with checkpoint and deliverabl ...
- (转)requirejs:杏仁的优化(almond)
使用场景 什么情况下需要使用 almond 呢?假设你手头有个基于requirejs的小项目,所有业务代码加起来就几十K(压缩后可能更小).出于性能优化的考虑,你可能在想:如果能够去掉requirej ...
- POJ 1692 Crossed Matchings(DP)
Description There are two rows of positive integer numbers. We can draw one line segment between any ...
- java IO回想小结
java IO原理 IO流用来处理设备之间的传输数据 输入(input):读取外部数据(磁盘.等存储设备)到程序() (内存)中 输出(output):将程序(内存)数据输出到磁盘等存储设备 java ...
- C#学习之在辅助线程中修改UI控件----invoke方法
Invoke and BeginInvoke 转载地址:http://www.cnblogs.com/worldreason/archive/2008/06/09/1216127.html 在Invo ...
- [Swust OJ 1097]--2014(数位dp)
题目链接:http://acm.swust.edu.cn/problem/1097/ Time limit(ms): 1000 Memory limit(kb): 32768 今年是2014年,所 ...
- BZOJ 2435: [Noi2011]道路修建( dfs )
NOI的水题...直接一遍DFS即可 ------------------------------------------------------------------------- #includ ...