Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python PyMongo批量插入内存不足_Python_Mongodb_Pymongo - Fatal编程技术网

Python PyMongo批量插入内存不足

Python PyMongo批量插入内存不足,python,mongodb,pymongo,Python,Mongodb,Pymongo,我正在尝试将一个大的HDF5文件写入MongoDB。我将遵循本教程中的示例:。我有一个生成器,它循环遍历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

我正在尝试将一个大的HDF5文件写入MongoDB。我将遵循本教程中的示例:。我有一个生成器,它循环遍历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正在内存中缓冲这些数据,并等待将其写入数据库。有没有办法限制缓冲区的大小,而不是让它无法控制地增长?奇怪的是,默认设置会导致我的内存不足。

PyMongo被设计为按照您想要的方式工作:它迭代您的生成器,直到它拥有一批数据(16或32MB,取决于MongoDB版本)。您使用的是什么MongoDB和PyMongo版本?

您看到什么Poces正在使用所有内存吗?MongoDB将要求操作系统允许的内存量;考虑到一个操作系统在填充RAM并需要分页新数据之前不会“重用”RAM,这可能只是操作系统的正常工作方式。至于控制MongoDB(这并不推荐),你可以使用ulimit:@Sammaye,它是使用内存的python(6.9GB)和mongod(3.1GB)。我有一个16GB的系统。奇怪的是,python应该有很好的内存。我对python内部的了解还不足以告诉你答案,我自己还在学习,对不起。