python LMDB 大型数据库(内存限制错误)
Posted
技术标签:
【中文标题】python LMDB 大型数据库(内存限制错误)【英文标题】:python LMDB large DBs (Memory Limit Error) 【发布时间】:2016-05-18 22:17:59 【问题描述】:我有一个很大的 lmdb,大约 800K 图像。 我只想一一阅读条目。 我的代码很简单,看起来像这样:
with env.begin() as txn:
cursor = txn.cursor()
for key, value in cursor:
print(key)
但是在阅读了大约 70000 个条目后,它会耗尽内存(~10GB)。 我不知道为什么。 我试着像下面那样做,但没有用。
for r in range(0,env.stat()['entries']):
if r%10000==0:
if r!=0:
txn.commit()
cur.close()
txn=env.begin()
cur = txn.cursor()
print("Change Change Change "+ str(r))
sys.stdout.flush()
if r==0:
cur.first()
else:
cur.set_range(key)
cur.next()
key, value = cur.item()
有什么建议吗?
【问题讨论】:
【参考方案1】:错误跟踪可能会有所帮助。我会查看map_size
参数。来自docs:
最大大小的数据库可以增长到;用于调整内存映射的大小。如果数据库增长大于 map_size,则会引发异常,用户必须关闭并重新打开环境。在 64 位上,使这个巨大(比如 1TB)没有任何惩罚。在 32 位上必须小于 2GB。
这将是一个写作时的例子:
with lmdb.open(LMDB_DIR, map_size=LMDB_MAX_SIZE) as env:
with env.begin(write=True) as txn:
return txn.put(mykey, value)
【讨论】:
这是错误日志:slurmstepd:作业 1008515 超出内存限制(65537464 > 65536000),被杀死 slurmstepd:*** JOB 1008515 ON mmm269 在 2016-05-18T15:09:41 * ** slurmstepd:在某些时候超出了步骤内存限制。 slurmstepd:这一次超出了作业内存限制,我分配了 64 GB 的内存,但又发生了。我的数据库的总大小为 596 GB。以上是关于python LMDB 大型数据库(内存限制错误)的主要内容,如果未能解决你的问题,请参考以下文章