我使用python库'mongoengine'来查询MongoDB。 这是代码:
mblog_list = MicroBlog.objects(omid__exists=False) # MicroBlog is a class I defined using mongoengine
data = []
for mblog in mblog_list:
weibo_created = mblog.created
请注意mblog_list
中有大约30000个项目,它使用大约2.5 G的磁盘空间。在上面的代码中,for
循环运行了几次并引发了“MemoryError”。
MongoDB服务器没有显示错误消息,但表示已关闭一个连接。
我也使用官方的js解释器发出相同的查询,它工作正常。
运行'ulimit -a'命令,我得到:
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 31723
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 31723
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
MongoDB版本:2.4.12
操作系统:Ubuntu 12.04
答案 0 :(得分:1)
这不是MongoDB问题,而是库mongoengine
。
默认情况下,在迭代返回的查询集时,mongoengine
会将所有返回的doc保留在内存中以供将来重用!
所以更改这样的代码将解决这个问题:
mblog_list = MicroBlog.objects(omid__exists=False).non_cache() # this should be the default behavior
谢谢!