【问题标题】:LMDB: Open large databases in a limited memory systemLMDB:在有限的内存系统中打开大型数据库
【发布时间】:2019-03-22 13:31:45
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-22
      • 2013-01-25
      • 1970-01-01
      • 1970-01-01
      • 2012-03-24
      • 2021-11-29
      相关资源
      最近更新 更多