python 释放内存_在python脚本中释放内存

我有一个

python脚本,刮了一些网址.我有一个网址列表,每个网址我得到HTML并用它做一些逻辑.

我使用Python 2.7.6和Linux Mint 17 Cinnamon 64位.

问题是我的主要抓取对象(我为每个url实例化)从不从内存中释放,尽管没有引用它.有了这个问题,我的记忆就会不断增长和快速增长(因为我的目标有时非常大 – 高达50MB).

简化代码看起来像这样:

def scrape_url(url):

"""

Simple helper method for scraping url

:param url: url for scraping

:return: some result

"""

scraper = Scraper(url) # instance main Scrape object

result = scraper.scrape() # scrape it

return result

## SCRIPT STARTS HERE

urls = get_urls() # fetch some list of urls

for url in urls:

print 'MEMORY USAGE BEFORE SCRAPE: %s (kb)' % resource.getrusage(resource.RUSAGE_SELF).ru_maxrss

result = scrape_url(url) # call helper method for scraping

print 'MEMORY USAGE AFTER SCRAPE: %s (kb)' % resource.getrusage(resource.RUSAGE_SELF).ru_maxrss

print '-' * 50

我的输出是这样的:

MEMORY USAGE BEFORE SCRAPE: 75732 (kb)

MEMORY USAGE AFTER SCRAPE: 137392 (kb)

--------------------------------------------------

MEMORY USAGE BEFORE SCRAPE: 137392 (kb)

MEMORY USAGE AFTER SCRAPE: 206748 (kb)

--------------------------------------------------

MEMORY USAGE BEFORE SCRAPE: 206748 (kb)

MEMORY USAGE AFTER SCRAPE: 284348 (kb)

--------------------------------------------------

Scrape对象很大,不会从内存中释放出来.

我试过了:

scraper = None

del scraper

甚至调用gc来收集对象:

gc.collect()

但没有任何帮助.

当我打印刮刀对象的引用数量时:

print sys.getrefcount(scraper)

我得到2,我认为这意味着没有其他对象的引用,应该由gc清理.

Scraper对象有很多子对象.有可能它的某些子对象的引用被遗留在某处,因此gc无法释放主Scaper对象或者还有其他原因导致python不释放内存吗?

我在SO中找到了一些关于这个问题的主题以及他们所说的内存无法释放的一些回复,除非你产生/杀死听起来很奇怪的子进程(LINK)

谢谢,

伊万

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>