仅个人目前遇见的内存问题, 可能不适用所有问题

一下只是简单的实例代码, 可能跑不起来, 只是看看

可变变量参数

小例子:

def foo(a, b=[]):
b.append(a)
print b
#
input: foo(1)
output: [1] #
input: foo(2)
output: [1,2]

解释说明:

参考: http://tianshu.xyz/blog/82/

官方文档中的一句话:

Default values are computed once, then re-used.

默认值是被重复使用的

Default parameter values are evaluated when the function definition is executed. This means that the expression is evaluated once, when the function is defined, and that the same “pre-computed” value is used for each call.

所以当默认参数值是可变对象的时候,那么每次使用该默认参数的时候,其实更改的是同一个变量

当python执行def语句时,它会根据编译好的函数体字节码和命名空间等信息新建一个函数对象,并且会计算默认参数的值。函数的所有构成要素均可通过它的属性来访问,比如可以用funcname属性来查看函数的名称。所有默认参数值则存储在函数对象的defaults_属性中,它的值为一个列表,列表中每一个元素均为一个默认参数的值

其中默认参数相当于函数的一个属性

Functions in Python are first-class objects, and not only a piece of code.

我们可以这样解读:函数也是对象,因此定义的时候就被执行,默认参数是函数的属性,它的值可能会随着函数被调用而改变。其他对象不都是如此吗?

其实使用 id(b) 的内存地址就很清楚了

解决:

def foo(a, b=None):
b = b if b is not None else []
b.append(a)
print b # 或者
def foo(b=None):
b = b or []

使用pyquery

小例子:

import requests
from pyquery import PyQuery def demo(url):
html = requests.get(url).text
print(html)
pq_html = PyQuery(html)
item_list = pq_html("#cm_cr-review_list>div[data-hook='review']")
for item in item_list:
iid = PyQuery(item)("div[data-hook='review']").attr("id")
print(iid) if __name__ == "__main__":
url = "评论页面链接"
demo(url)

项目说明

这个是项目中的一部分, 抓取评论的页面:

在将整个页面转为PyQuery的对象后, 提取出评论列表, 然后遍历评论列表, 再将每个评论的html转为PyQuery对象, 也个页面还好, 但是现在目前好像没有单线程爬虫了吧! 结果可想而知

解决方法

在看了PyQuery官方文档后, 发现可以这样:

    item_list = pq_html("#cm_cr-review_list>div[data-hook='review']")
for item in item_list.items():
iid = item("div[data-hook='review']").attr("id")
print(iid)

也可以使用xpath

    item_list = etree.HTML("#cm_cr-review_list>div[data-hook='review']")
for item in item_list:
iid = item.xpath("//div[@data-hook='review']/@id")
print(iid) # from lxml import etree

这样直接使用对象来进行提取元素, 会节省很大一部分内存

使用requests session

小例子

import requests

class Download(object):
def __init__(self):
self.session = requests.session() def down(self, url, try_time=10):
while try_time:
try:
response = self.session.get(url)
except Exception as e:
print(e)
finally:
try_time -= 1

项目说明

在使用session的时候, 内存会直线上升, 并且没有下降的趋势, 直到内存崩溃, 特别是重试的时候, 目前没有搞懂为什么session会这样? 希望懂的大神解释一下

解决

目前是不使用session, 直接使用requests.get()

求大神赐教

四. 持续更新......

以后遇见的bug, 或者内存泄漏问题都会记录下来, 避免更多人踩坑 :)

也希望大家可以补充自己遇见的大坑

Python-内存泄漏 持续增长 检查点的更多相关文章

  1. 【原创】python内存泄漏以及python flask框架莫名coredump

    1.python内存泄漏 今天在看服务器上的进程时,用top查的时候,发现一个一直跑的脚本程序内存竟然达到了1.6G,这个脚本我有印象,一开始仅占用20M左右,显然是内存泄漏了. 用gc和objgra ...

  2. 填坑总结:python内存泄漏排查小技巧

    摘要:最近服务遇到了内存泄漏问题,运维同学紧急呼叫解决,于是在解决问题之余也系统记录了下内存泄漏问题的常见解决思路. 本文分享自华为云社区<python内存泄漏排查小技巧>,作者:luti ...

  3. python 内存泄漏调试

    Python应用程序内存泄漏的调试 Quake Lee quakelee@geekcn.org 新浪网技术(中国)有限公司 Sina Research & Development Python ...

  4. 一次python 内存泄漏解决过程

    最近工作中慢慢开始用python协程相关的东西,所以用到了一些相关模块,如aiohttp, aiomysql, aioredis等,用的过程中也碰到的很多问题,这里整理了一次内存泄漏的问题 通常我们写 ...

  5. python内存泄漏

    记录: 一个脚本在连续运行后,使用内存越来越大,在循环后手动添加gc.collect()没有作用. 尝试方法: 去除所有函数中当作参数传入的全局变量 使用全局redis对象,不再当作参数传入 循环末尾 ...

  6. python内存泄漏,python垃圾手动回收,1

    部署的舆情系统,内存变大,找原因. 一个小例子. def func(): local_list = list(range(10000000)) func() time.sleep(200) 能够观察到 ...

  7. python内存泄露memory leak排查记录

    问题描述 A服务,是一个检测MGR集群主节点是否发生变化的服务,使用python语言实现的. 针对每个集群,主线程会创建一个子线程,并由子线程去检测.子线程会频繁的创建和销毁. 上线以后,由于经常会有 ...

  8. Python之内存泄漏和内存溢出

    预习知识:python之MRO和垃圾回收机制 一.内存泄漏 像Java程序一样,虽然Python本身也有垃圾回收的功能,但是同样也会产生内存泄漏的问题.对于一个用 python 实现的,长期运行的后台 ...

  9. <转>Python的内存泄漏及gc模块的使用分析

    一般来说在 Python 中,为了解决内存泄漏问题,采用了对象引用计数,并基于引用计数实现自动垃圾回收.由于Python 有了自动垃圾回收功能,就造成了不少初学者误认为自己从此过上了好日子,不必再受内 ...

随机推荐

  1. SpringBoot入门初体验

    概述 Java项目开发中繁多的配置,复杂的部署流程和第三方技术集成让码农在开发项目中效率低下,因此springBoot应运而生. 环境 IntelliJ IDEA 2018.3 jkd1.8 开始(傻 ...

  2. [转] js async await 终极异步解决方案

    阅读目录 回顾 Promise async await 字面理解 async.await 如何执行 await 操作符 总结 既然有了promise 为什么还要有async await ? 当然是pr ...

  3. SQL怎么实现SLEEP功能(等待时间) -(转载)

    语法格式: WAITFOR DELAY N'小时数:分钟数:秒数.毫秒数' 等待100毫秒: SELECT GETDATE() WAITFOR DELAY N'00:00:00.100' SELECT ...

  4. Web前端推荐学习站点

    http://javascript.ruanyifeng.com/   JavaScript参考标准教程,写的很不错. https://www.xiaohuochai.cc/  小火柴前端站 http ...

  5. 使用Python搭建http服务器

    David Wheeler有一句名言:“计算机科学中的任何问题,都可以通过加上另一层间接的中间层解决.”为了提高Python网络服务的可移植性,Python社区在PEP 333中提出了Web服务器网关 ...

  6. Numpy和Pandas的使用入门

    Numpy Numpy基本数据结构 np.array()函数接受一个多维list,返回对应纬度的矩阵 vector = np.array([1, 2, 3, 4]) matrix = np.array ...

  7. ES10(2019)有哪些更新和新特性?

    ES10新特性(2019) 行分隔符(U + 2028)和段分隔符(U + 2029)符号现在允许在字符串文字中,与JSON匹配 更加友好的 JSON.stringify 新增了Array的flat( ...

  8. MySQL添加用户、为用户分配权限

    登录MySQL登录本地用户 mysql -u root -p登录外网用户(需要注意服务器可能只允许本地登录,需要修改响应的配置文件) mysql -u zhrt -h 10.64.6.4 -p添加用户 ...

  9. Oracle数据库备份还原笔记

    Oracle数据库备份还原笔记 通过查阅资料知道Oracle备份还原的方式有三种.分别的是导出/导入.热备份和冷备份.导出/导入是一种逻辑备份.而热备份和冷备份是物理备份.[参考资料(https:// ...

  10. etcd和flannel实现docker跨物理机通信

    实验目标 跨物理机的容器之间能直接访问docker通过Flannel可以实现各容器间的相互通信,即宿主机和容器,容器和容器之间都能相互通信 实验环境 192.168.3.50 //etcd.flann ...