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 大型数据库(内存限制错误)的主要内容,如果未能解决你的问题,请参考以下文章

如何用内存高效的数据结构替换大型 python 字典?

在内存数据库中使用 LMDB

Python LMDB的使用

处理大型数据集和内存限制 [关闭]

Python操作SQLite/MySQL/LMDB

绕过内存错误以在 Python 中读取大型 JSON 文件 [关闭]