来当个伸手党,用 python 写的爬虫,在 win 下内存占用就 70M 多,为什么放到 512m 的 vps 下没多久就被 kill 掉

2015-07-20 10:33:52 +08:00
 sandideas
7897 次点击
所在节点    Python
40 条回复
msg7086
2015-07-20 14:01:55 +08:00
@sandideas 首先你要看的是commit charge,这个关系到进程是否被kill。
sandideas
2015-07-20 14:08:24 +08:00
@knightlhs
@msg7086
@neoblackcap
@kqz901002
非常感谢你们回复。。
找到原因了,因为系统和mysql之类的会占用到百分之40左右的内存。
而我的代码会在刚开始一段时间从70多到200+。然后才会稳定到70多。。
原本默认的swap才100m。。我改成1g就够了。这样就不会被系统kill掉了。
新手。。莫笑。
sandideas
2015-07-20 14:09:16 +08:00
@knightlhs cpu超的话会导致进程被kill么。。我看cpu在vps里面一直占到90+。。
sandideas
2015-07-20 14:12:56 +08:00
@neoblackcap
@knightlhs
不贴代码是因为实在写的渣。。好多异常懒得处理直接忽视了。。
试运行可以了再优化代码。
knightlhs
2015-07-20 14:13:25 +08:00
@sandideas
这个要看主机商的设定 我这里无法粗浅的下结论
一般的中小型VPS提供商 长时间占用CPU不但会kill 还会封帐号
但是也是有区分的 有些专供计算类的云产品 是可以长时间高负荷的 只是价格比较喜人
具体你要问问你的服务商 具体的要求是什么了
sandideas
2015-07-20 14:21:21 +08:00
@knightlhs 了解了。。那我发个tk问一下客服
zts1993
2015-07-20 14:37:19 +08:00
一般主机的后台会有监控 可以查看 CPU内存的使用历史记录
sandideas
2015-07-20 20:20:42 +08:00
http://paste.ubuntu.com/11908931/

@knightlhs
@neoblackcap
@icedx
我还是贴代码吧。。
虽然可以运行,但是swap速度太慢了。
开了是个线程内存就会涨到300+
icedx
2015-07-21 02:45:58 +08:00
我感觉是你这个bs4 的对象没有被及时回收
开始代码 soup=BeautifulSoup(page)
sandideas
2015-07-21 07:59:57 +08:00
@icedx 好的。。我试试
sandideas
2015-07-21 09:18:01 +08:00
@icedx 回收是怎么回收。。我直接del soup不行。。没发现soup有close。。
icedx
2015-07-21 10:53:14 +08:00
@sandideas 应该是函数执行结束后自动回收... 但是多线程下 内存使用瞬间飙升
sandideas
2015-07-21 11:03:36 +08:00
@icedx 那就没解决办法了么。。一般爬虫是怎么写的,都会内存占用很多么。
knightlhs
2015-07-21 11:09:17 +08:00
@sandideas
我对python不熟悉 我说一下我在go上写爬虫的思路
首先 你的解析器不需要每个线程上都new一个
采集线程上只要抓取到页面的信息就OK了 降低负载
采集回来的信息放进 队列里面 等待解析器统一处理(单例)因为这个玩意大多是单线程的
解析结果 出来以后 分析是否是列表 还是正文
如果是列表 那么返回采集队列 继续抓取
如果是正文 就可以保存了

一般系统开销都不在 采集这块 我一般可以开到 30-50个并发
解析器可以多实现几个 分布式 处理 通过 队列随机分配
这样就可以有效的降低 负载
供你参考
sandideas
2015-07-21 11:16:05 +08:00
@knightlhs 多谢。。我这个最早是单线程的,后来觉得速度慢按照样例改成多线程的。
的确是没想过解析器不需要多线程。
待会有空改一下试试。。
knightlhs
2015-07-21 11:24:48 +08:00
@sandideas
速度慢的问题 一般都不在采集跟解析 回头你自己写一个分析下
写入这块你分离出来 用一个单例实现 看看采集完成的时间 (不记写入时间)
我觉得你速度慢的原因可能在写入 磁盘效率不高 导致队列阻塞了
如果是这也原因的话 换保存方式 比如 mysql
sandideas
2015-07-21 12:06:22 +08:00
@knightlhs 好的。非常感谢
sandideas
2015-07-21 12:09:52 +08:00
@knightlhs 那cpu占用很高会有哪些原因。。我在I7下都会达到20%。。。没有多少循环嵌套啊。
正则匹配的时候会占用很多CPU么。
knightlhs
2015-07-21 15:32:44 +08:00
@sandideas 正则的效率确实不高 你需要使用一些基于DOM的解析引擎
icedx
2015-07-21 19:55:19 +08:00
@sandideas 你要吧bs4 处理的过程放在独立的函数里 不要返回bs4 对象

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/206889

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX