【问题标题】:PyMongo Bulk Insert Runs out of memoryPyMongo 批量插入内存不足
【发布时间】:2014-11-20 06:49:18
【问题描述】:

我正在尝试将大型 HDF5 文件写入 MongoDB。我正在关注本教程中的示例:http://api.mongodb.org/python/current/examples/bulk.html。我有一个生成器,它遍历 HDF 文件的每一行并生成一个字典:

def gen():
    for file in files:
        data = load_file(file)
        for row in data:
            ob = dict()

            ob['a'] = int(row['a'])
            ob['b'] = int(row['b'])
            ob['c'] = int(row['c'])
            ob['d'] = row['d'].tolist()
            ob['e'] = row['e'].tolist()
            ob['f'] = row['f'].tolist()
            ob['g'] = row['g'].tolist()

            yield ob

def main():
    data = gen()
    db = pymongo.MongoClient().data_db
    db.data.insert(data)

这工作正常,但随着时间的推移,Python 进程占用越来越多的 RAM,直到达到 10GB 并威胁要耗尽所有内存。我认为 PyMongo 正在将这些数据缓冲在内存中,并等待将其写入数据库。有没有办法可以限制这个缓冲区的大小,而不是让它不受控制地增长?奇怪的是默认设置会导致我用完 RAM。

【问题讨论】:

  • 你看到什么进程正在使用所有内存吗? MongoDB 将要求操作系统允许的尽可能多的内存;考虑到操作系统在填满 RAM 并需要分页新数据之前不会“重用”RAM,这可能只是操作系统的正常工作。
  • 至于控制MongoDB(不是很推荐)可以使用ulimit:docs.mongodb.org/manual/reference/ulimit
  • @Sammaye 使用内存的是 python (6.9GB) 和 mongod (3.1GB)。我有一个 16GB 的系统。
  • 奇怪,python 应该对内存很好。好吧,我对python内部的了解还不够多,无法告诉你答案,我自己还在学习,对不起。

标签: python mongodb pymongo


【解决方案1】:

PyMongo 旨在按照您想要的方式工作:它会迭代您的生成器,直到它拥有一批数据(16 或 32MB,取决于 MongoDB 版本)。 Someone contributed this ability to PyMongo last year。您使用的是什么 MongoDB 和 PyMongo 版本?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-16
    • 1970-01-01
    • 1970-01-01
    • 2012-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-25
    相关资源
    最近更新 更多