PyMongo Bulk Insert运行内存不足

时间:2014-11-20 06:49:18

标签: python mongodb pymongo

我试图将大型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耗尽,这很奇怪。

1 个答案:

答案 0 :(得分:0)

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