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

LMDB: Open large databases in a limited memory system

我有一个程序预计会使用 几 GB 的 lmdb 磁盘空间(这是一个区块链,我们正在远离 leveldb 因为它 缺少 ACID,我需要它来制定一些未来的计划)。是否可以在 Raspberry Pi 上 运行 使用该数据库的程序而不添加更多交换( 内存 >1 GB)? (考虑到添加 swap 是为高级用户准备的)。

当前,当我运行那个程序mdb_env_set_mapsize(1 << 30),因此1 GB 的地图大小,它returns 错误 12 ,内存不足。但是,如果我将大小减小到 512 MB,它就会起作用。

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

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

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

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

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