gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:33:55 28 4
gpt4 key购买 nike

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

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

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

最佳答案

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

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

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

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

关于c++ - LMDB:在有限的内存系统中打开大型数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52862176/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com