爬蟲(chóng)時(shí),如果不使用pymongo的close方法,python xxx.py內(nèi)存會(huì)一點(diǎn)一點(diǎn)的上漲,最開(kāi)始900多M,慢慢的就1個(gè)多G,快到2G了。但是速度快,在tail -f log的時(shí)候,基本看不清輸出信息。
如果使用了close方法,內(nèi)存穩(wěn)定在500M左右,但是讀和取數(shù)據(jù)庫(kù)速度慢,在tail log的時(shí)候,能看到正在保存哪個(gè)URL,正在獲取哪個(gè)URL。
請(qǐng)問(wèn)我該如何解決這個(gè)問(wèn)題呢。
#-*-coding:utf-8-*-
import logging
import setting
import time,datetime
from setting import mongo_host,mongo_port,mongo_db_name_data,mongo_db_name_linkbase,mongo_db_name_task
import pymongo
logging.basicConfig(filename='log',level=logging.INFO)
class Connect_mongo(object):
def __init__(self):
self.mongo_host = mongo_host
self.mongo_port = mongo_port
self.conn()
def conn(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.linkbase
self.db_task = self.client[mongo_db_name_task]
def insert_db(self,item):
setting.my_logger.info('當(dāng)前插入數(shù)據(jù)庫(kù)的最終數(shù)據(jù)為%s'%item)
self.db_data.xxx_data.update({"car_id":item['car_id']},item,True)
self.client.close()
def save_linkbase(self,response_result,spider_name,hash_url,item_type):
if item_type == 'carinfo_item':
linkinfo = {}
linkinfo['status'] = response_result.status_code
linkinfo['url'] = response_result.url
linkinfo['spider_name'] = spider_name
linkinfo['hash_url'] = hash_url
#保存到linkbase
self.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_code
linkinfo['url'] = response_result.url
linkinfo['spider_name'] = spider_name
linkinfo['hash_url'] = hash_url
linkinfo['over_time'] = datetime.datetime.utcnow()
#保存到linkbase
self.db_linkbase_collection.update({"status":linkinfo['status'],"hash_url":hash_url},linkinfo,True)
self.client.close()
def save_task(self,task):
setting.my_logger.info('當(dāng)前插入數(shù)據(jù)庫(kù)的task信息為%s'%task)
self.db_task.xxx_task.update({'url':task['url']},task,True)
self.client.close()
def get_task(self,max_requests=10):
task = []
for i in range(max_requests):
result = self.db_task.xxx_task.find_one_and_delete({})
task.append(result)
return task
def duplicate_removal(self,hash_data):
result = self.db_linkbase.linkbase.find_one({'hash_url':hash_data})
if result == None:
return True
else:
return False
mongo_insert = Connect_mongo()
在另一個(gè)py文件中使用requests進(jìn)行爬蟲(chóng)和xpath進(jìn)行處理,然后存儲(chǔ)或取數(shù)據(jù)庫(kù)。
內(nèi)存占用跟你取出來(lái)的數(shù)據(jù)是如何緩存,以及你是否釋放了內(nèi)存有關(guān)。
舉個(gè)例子,一次性取出5萬(wàn)條記錄,然后存在一個(gè)list中,如果取多了,不停往list中添加,內(nèi)存占用自然就大了,因?yàn)楸旧韮?nèi)存中存的數(shù)據(jù)就這么大,你都要用到,這是沒(méi)辦法解決的問(wèn)題。除非你擴(kuò)內(nèi)存條。
而如果是另一種情況,你每次都實(shí)例化一個(gè)MongoClient,查詢出來(lái)的task沒(méi)有刪掉,就會(huì)導(dǎo)致無(wú)用的result還緩存著數(shù)據(jù),沒(méi)有被回收,導(dǎo)致內(nèi)存成倍增長(zhǎng)。此時(shí),只要在你不用這些數(shù)據(jù)的時(shí)候del task一下就OK了。
你如何使用的,如何導(dǎo)致內(nèi)存增長(zhǎng)的得自己看。
北大青鳥(niǎo)APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國(guó)IT技能型緊缺人才,是大數(shù)據(jù)專(zhuān)業(yè)的國(guó)家
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國(guó)一站式人才培養(yǎng)平臺(tái)、一站式人才輸送平臺(tái)。2014年4月3日在美國(guó)成功上市,融資1
北大課工場(chǎng)是北京大學(xué)校辦產(chǎn)業(yè)為響應(yīng)國(guó)家深化產(chǎn)教融合/校企合作的政策,積極推進(jìn)“中國(guó)制造2025”,實(shí)現(xiàn)中華民族偉大復(fù)興的升級(jí)產(chǎn)業(yè)鏈。利用北京大學(xué)優(yōu)質(zhì)教育資源及背
博為峰,中國(guó)職業(yè)人才培訓(xùn)領(lǐng)域的先行者
曾工作于聯(lián)想擔(dān)任系統(tǒng)開(kāi)發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動(dòng)互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺(tái)面向?qū)ο箝_(kāi)發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫(kù),具有快速界面開(kāi)發(fā)的能力,對(duì)瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁(yè)制作和網(wǎng)頁(yè)游戲開(kāi)發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開(kāi)發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國(guó)Software AG 技術(shù)顧問(wèn),美國(guó)Dachieve 系統(tǒng)架構(gòu)師,美國(guó)AngelEngineers Inc. 系統(tǒng)架構(gòu)師。