使用python从MongoDB查询大数据的EC2失败了

时间:2016-04-22 10:17:58

标签: python mongodb performance amazon-ec2 pymongo

目前我已经在使用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都包含大量元素(单词)。反正我有没有解决这个问题?

1 个答案:

答案 0 :(得分:2)

您似乎正在创建一个非常大的列表result,并且该列表已超出实例中的可用内存。通常,这表明您需要重新设计系统的某些部分,以便只需要python处理您真正需要的数据。一些选择:

  • pymongo的find返回cursor - 也许你根本不需要这个列表
  • 在插入和存储数据时处理有关数据的信息 另一个集合
  • 使用查询和aggregation以您需要的格式从数据库中返回所需内容
  • 在多台计算机上拆分处理

还有其他方法但是这样的错误会导致你问自己“我是否需要在python列表中获取所有这些数据?”