【发布时间】: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内部的了解还不够多,无法告诉你答案,我自己还在学习,对不起。