LMDB:在有限的内存系统中打开大型数据库

LMDB: Open large databases in a limited memory system

本文关键字:大型 数据库 系统 内存 LMDB      更新时间:2023-10-16

我有一个程序,预计使用几GB的lmdb磁盘空间(它是一个区块链,由于缺乏ACID,我们正在远离leveldb我需要一些未来的计划(。是否可以在不添加更多交换(具有>1 GB 内存(的情况下在Raspberry Pi上使用该数据库运行该程序?(考虑到添加交换适用于高级用户(。

目前,当我mdb_env_set_mapsize(1 << 30)运行该程序时,因此1 GB 的 mapsize,它返回错误 12,即内存不足。但是如果我将大小减小到512 MB,它可以工作。

但是,当数据库大小不断增加时,在 lmdb 中处理此类内存问题的正确方法是什么?

可以进行内存映射的最大内存大小取决于虚拟地址空间的大小,该大小由 CPU 的虚拟内存管理器决定。32 位 CPU 的虚拟地址空间限制为 4GB,此限制适用于整个系统,除非启用了 PAE,在这种情况下,限制是每个进程的。

除此之外,内核和应用程序还会在地址空间上保留一些自己的空间,并且内存分配通常需要连续的地址空间,从而减少了可供数据库分配的内存。

因此,您的用户需要在其系统上启用 PAE,或升级到 64 位 CPU。如果这两个选项在应用程序中都不是,则不能使用大于可用地址空间的内存映射文件,因此必须执行一些分段,将数据拆分为多个文件,一次只能映射小块。我猜 lmdb 要求它可以将整个数据库文件映射到内存中。

对于区块链应用程序,您的数据主要是日志条目的线性序列,因此您的应用程序在大多数情况下只需要使用最新的条目。您可以将最近的条目分离到其自己的工作文件中,并将日志的其余部分分离到不需要将整个文件映射到内存或多个固定大小的文件中,您可以根据需要映射和取消映射。