如何提升mongodb find速率
linkbase中存有几十万条url,数据如下所示:
{ "_id" : ObjectId("5a322cad6c85e0369ab54161"), "url" : "https://www.xxxx.com/", "status_code" : 0, "spider_name" : "test_spider", "crawl_time" : "2017-12-14 15:47:57" }
{ "_id" : ObjectId("5a322c9f6c85e03699b54227"), "url" : "https://www.xxxxaa.com/", "status_code" : 0, "spider_name" : "test_spider", "crawl_time" : "2017-12-14 15:47:43" }
{ "_id" : ObjectId("5a2f082c6c85e0c65bc553c9"), "url" : "https://aabb.com", "status_code" : 403, "spider_name" : "test_spider", "crawl_time" : "2017-12-12 06:35:24" }
{ "_id" : ObjectId("5a2f082b6c85e0c65bc553c8"), "url" : "https://cccc.com", "status_code" : 403, "spider_name" : "test_spider", "crawl_time" : "2017-12-12 06:35:23" }
我用数据库查询工具,db.linkbase.find({"spider_name":"test_spider"})大约耗时122秒
数据库有相关索引
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "linkbase.linkbase"
},
{
"v" : 1,
"key" : {
"spider_name" : 1
},
"name" : "spider_name_1",
"ns" : "linkbase.linkbase"
}
]
程序调用一个函数,max_requests每次取10个:
def get_mongodb_linkbase(self,max_requests):
linkbase = []
for i in range(max_requests):
result = self.db_linkbase_collection.find_one_and_delete({'spider_name':'test_spider'})
if result == None:
continue
else:
linkbase.append(result)
return linkbase
可是爬虫运行的时候,感觉速度并不快,爬虫代码采用了协程gevent,每个协程开50个
def handle_linkbase():
while True:
linkbase_info = mongo_insert.get_mongodb_linkbase(10)
if len(linkbase_info) == 0:
time.sleep(random.choice(range(60)))
else:
for url in linkbase_info:
test.header['User-Agent'] = random.choice(setting.user_agent)
test.save_url_to_task(url['url'],header=test.header)
def gevent_fun_linkbase():
jobs = [gevent.spawn(handle_linkbase) for i in range(50)]
gevent.joinall(jobs)
m2 = multiprocessing.Process(target=gevent_fun_linkbase)
m2.start()
m2.join()
并将协程放入多进程。也就是三个进程分别运行三个协程,每个协程里开50个程序。但是感觉速度并不快,甚至有卡顿现象。就是在tail -f log的时候,发现有几秒中,无信息输出,并且运行速度慢。
目前不太清楚是不是mongodb查询时候造成的卡顿。
感觉也不是代理造成的卡顿,requests我把重试关了,timeout为1.
请各位大牛帮忙分析。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
是122秒还是122ms?122秒的话相当慢了。
如果不确定是不是MongoDB方的问题,可以先用profiler看一下执行的查询到底花了多少时间。从你上面的信息来看,我比较倾向于不是数据库这一端慢。
经过排查,应该就是卡在requests那里了,代理的有效性不高。。。。。。