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

时间:2018-10-17 19:21:00

标签: c++ linux memory memory-mapped-files lmdb

我有一个计划使用几个GB的lmdb磁盘空间的程序(这是一个区块链,由于 leveldb 的,我们正在使用它>缺少ACID ,这是我将来的一些计划所需要的)。是否可以在 Raspberry Pi 上与该数据库一起运行该程序,而无需添加更多交换空间(具有1 GB以上的内存)? (考虑到添加交换是针对高级用户的。)

当前,当我运行该程序mdb_env_set_mapsize(1 << 30)时,因此 1 GB的mapsize ,它返回错误12 ,该错误已超出内存。但是,如果我将大小减小为 512 MB ,则可以使用。

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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