目前我已经在使用Amazon Linux的EC2上安装了MongoDB。它有大约1M文档。
在同一个EC2上,我使用pymongo db.collection.find({},{' attribute_1':1})来查询所有文档中的所有attribute_1。
问题是,在迭代和检索大约200,000个文档之后,我的python代码就停止了工作。
它没有显示任何错误(我确实尝试了捕获)。在mongodb日志中也没有显示任何特定错误。
我非常怀疑它是因为EC2的网络带宽,但是,我试图分批分割文件,每批100,000个文件。它仍然不起作用。它只会自动打破大约200,000个文档。代码如下:
count = db.collection.count()
page = int(ceil(count/100000.0))
result = []
i = 0
for p in range(0, page):
temp = db.collection.find({}, {'attribute_1':1})[p*100000:p*100000+100000]
for t in temp:
result.append(t['attribute_1'])
i = i+1
print i
我也尝试了EC2日志,发现没有什么奇怪的。中断后EC2继续正常工作(我仍然可以访问命令行,cd,ls等)我的EC2实例是c3.2xlarge。我目前坚持这几天,任何帮助表示赞赏。提前致谢。
更新:搜索系统日志后,我发现了这些:
Apr 22 10:12:53 ip-xxx kernel: [ 8774.975653] Out of memory: Kill process 3709 (python) score 509 or sacrifice child
Apr 22 10:12:53 ip-xxx kernel: [ 8774.978941] Killed process 3709 (python) total-vm:8697496kB, anon-rss:8078912kB, file-rss:48kB
我的EC2实例已经有15 GB RAM。 Attribute_1是一个python的单词列表。每个Attribute_1都包含大量元素(单词)。反正我有没有解决这个问题?
答案 0 :(得分:2)
您似乎正在创建一个非常大的列表result
,并且该列表已超出实例中的可用内存。通常,这表明您需要重新设计系统的某些部分,以便只需要python处理您真正需要的数据。一些选择:
find
返回cursor - 也许你根本不需要这个列表还有其他方法但是这样的错误会导致你问自己“我是否需要在python列表中获取所有这些数据?”