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

爬虫时,如果不使用pymongo的close方法,python xxx.py内存会一点一点的上涨,最开始900多M,慢慢的就1个多G,快到2G了。但是速度快,在tail -f log的时候,基本看不清输出信息。

如果使用了close方法,内存稳定在500M左右,但是读和取数据库速度慢,在tail log的时候,能看到正在保存哪个URL,正在获取哪个URL。

请问我该如何解决这个问题呢。

#-*-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('当前插入数据库的最终数据为%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('当前插入数据库的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()

在另一个py文件中使用requests进行爬虫和xpath进行处理,然后存储或取数据库。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值