为了账号安全,请及时绑定邮箱和手机立即绑定

pymongo不使用close方法时,内存占用很大,求解

pymongo不使用close方法时,内存占用很大,求解

翻阅古今 2019-05-24 11:40:21
爬虫时,如果不使用pymongo的close方法,pythonxxx.py内存会一点一点的上涨,最开始900多M,慢慢的就1个多G,快到2G了。但是速度快,在tail-flog的时候,基本看不清输出信息。如果使用了close方法,内存稳定在500M左右,但是读和取数据库速度慢,在taillog的时候,能看到正在保存哪个URL,正在获取哪个URL。请问我该如何解决这个问题呢。#-*-coding:utf-8-*-importloggingimportsettingimporttime,datetimefromsettingimportmongo_host,mongo_port,mongo_db_name_data,mongo_db_name_linkbase,mongo_db_name_taskimportpymongologging.basicConfig(filename='log',level=logging.INFO)classConnect_mongo(object):def__init__(self):self.mongo_host=mongo_hostself.mongo_port=mongo_portself.conn()defconn(self):self.client=pymongo.MongoClient(host=self.mongo_host,port=self.mongo_port)self.db_data=self.client[mongo_db_name_data]self.db_linkbase=self.client[mongo_db_name_linkbase]self.db_linkbase_collection=self.db_linkbase.linkbaseself.db_task=self.client[mongo_db_name_task]definsert_db(self,item):setting.my_logger.info('当前插入数据库的最终数据为%s'%item)self.db_data.xxx_data.update({"car_id":item['car_id']},item,True)self.client.close()defsave_linkbase(self,response_result,spider_name,hash_url,item_type):ifitem_type=='carinfo_item':linkinfo={}linkinfo['status']=response_result.status_codelinkinfo['url']=response_result.urllinkinfo['spider_name']=spider_namelinkinfo['hash_url']=hash_url#保存到linkbaseself.db_linkbase_collection.update({"status":linkinfo['status'],"hash_url":hash_url},linkinfo,True)self.client.close()else:self.db_linkbase_collection.create_index([("over_time",pymongo.ASCENDING)],expireAfterSeconds=7200)linkinfo={}linkinfo['status']=response_result.status_codelinkinfo['url']=response_result.urllinkinfo['spider_name']=spider_namelinkinfo['hash_url']=hash_urllinkinfo['over_time']=datetime.datetime.utcnow()#保存到linkbaseself.db_linkbase_collection.update({"status":linkinfo['status'],"hash_url":hash_url},linkinfo,True)self.client.close()defsave_task(self,task):setting.my_logger.info('当前插入数据库的task信息为%s'%task)self.db_task.xxx_task.update({'url':task['url']},task,True)self.client.close()defget_task(self,max_requests=10):task=[]foriinrange(max_requests):result=self.db_task.xxx_task.find_one_and_delete({})task.append(result)returntaskdefduplicate_removal(self,hash_data):result=self.db_linkbase.linkbase.find_one({'hash_url':hash_data})ifresult==None:returnTrueelse:returnFalsemongo_insert=Connect_mongo()在另一个py文件中使用requests进行爬虫和xpath进行处理,然后存储或取数据库。
查看完整描述

2 回答

?
慕姐8265434

TA贡献1813条经验 获得超2个赞

内存占用跟你取出来的数据是如何缓存,以及你是否释放了内存有关。举个例子,一次性取出5万条记录,然后存在一个list中,如果取多了,不停往list中添加,内存占用自然就大了,因为本身内存中存的数据就这么大,你都要用到,这是没办法解决的问题。除非你扩内存条。而如果是另一种情况,你每次都实例化一个MongoClient,查询出来的task没有删掉,就会导致无用的result还缓存着数据,没有被回收,导致内存成倍增长。此时,只要在你不用这些数据的时候deltask一下就OK了。你如何使用的,如何导致内存增长的得自己看。
                            
查看完整回答
反对 回复 2019-05-24
  • 2 回答
  • 0 关注
  • 1085 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信