Bre*_*ett 5 python mongodb pymongo
我有一个包含> 1,000,000个文档的MongoDB集合.我正在执行一个初始化.find({ my_query })来返回这些文档的子集(~25,000个文档),然后我将它放入一个list对象中.
然后我循环遍历每个对象,从列表中返回的文档中解析一些值,并通过代码使用这些解析的值执行其他查询:
def _perform_queries(query):
conn = pymongo.MongoClient('mongodb://localhost:27017')
try:
coll = conn.databases['race_results']
races = coll.find(query).sort("date", -1)
except BaseException, err:
print('An error occured in runner query: %s\n' % err)
finally:
conn.close()
return races
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我的query字典是:
{"$and": [{"opponents":
{"$elemMatch": {"$and": [
{"runner.name": name},
{"runner.jockey": jockey}
]}}},
{"summary.dist": "1"}
]}
Run Code Online (Sandbox Code Playgroud)
这是我的问题.我在opponents.runner.name和上创建了一个索引opponents.runner.jockey.这使查询真的非常快.然而,在连续大约10,000个查询之后,pymongo引发了一个异常:
pymongo.errors.AutoReconnect: [Errno 49] Can't assign requested address
Run Code Online (Sandbox Code Playgroud)
当我删除索引时,我没有看到此错误.但它需要0.5 seconds每个查询,在我的情况下无法使用.
有谁知道为什么[Errno 49] can't assign requested address会发生?我已经看到了一些与pymongo有关can't assign requested address但与之无关的其他SO问题,答案并没有引导我到任何地方.
更新:
根据Serge的建议,下面的输出是ulimit -a:
core file size (blocks, -c) unlimited
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
max locked memory (kbytes, -l) unlimited
max memory size (kbytes, -m) unlimited
open files (-n) 2560
pipe size (512 bytes, -p) 1
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 709
virtual memory (kbytes, -v) unlimited
Run Code Online (Sandbox Code Playgroud)
我的MongoDB运行在OS X Yosemite上.
A. *_*vis 13
这是因为您错误地使用PyMongo.您正在为每个查询创建一个新的MongoClient,这需要您为每个新查询打开一个新套接字.这会破坏PyMongo的连接池,除了速度极慢之外,它还意味着你比TCP堆栈更快地打开和关闭套接字:在TIME_WAIT状态下留下太多套接字,这样你最终会耗尽端口.
幸运的是,修复很简单.创建一个MongoClient并在整个过程中使用它:
conn = pymongo.MongoClient('mongodb://localhost:27017')
coll = conn.databases['race_results']
def _perform_queries(query):
return coll.find(query).sort("date", -1)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2485 次 |
| 最近记录: |