LMDB:在有限的内存系统中打开大型数据库
LMDB: Open large databases in a limited memory system
我有一个程序,预计使用几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 要求它可以将整个数据库文件映射到内存中。
对于区块链应用程序,您的数据主要是日志条目的线性序列,因此您的应用程序在大多数情况下只需要使用最新的条目。您可以将最近的条目分离到其自己的工作文件中,并将日志的其余部分分离到不需要将整个文件映射到内存或多个固定大小的文件中,您可以根据需要映射和取消映射。
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- C++中高效的大型稀疏块压缩线性方程
- 查询SQLite数据库中的日期
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何在ArangoDb AQL查询中指定数据库
- 从数据库实时显示QT c++中的数据
- 使用 pqxx 将 std::vector 存储在 postgresql 中,并从数据库中检索它
- 无法在C++中建立与MySQL数据库的连接
- 将类实现到数据库程序中
- 连接 dockerized 模型和 dockerized 数据库时出现"无法 SQLConnect"错误
- 如何实现高效的算法来计算大型数据集的多个不同值?
- C++应用程序 MySQL odbc 数据库连接错误:在引发"otl_tmpl_exception<>"实例后终止调用
- 调试编译的服务器在数据库打开时崩溃
- C++变量mysql_query到数据库
- LMDB:在有限的内存系统中打开大型数据库
- 如何在多个线程中创建 QSql数据库连接时防止名称冲突
- 以只读模式打开数据库时SQLITE_CANTOPEN错误
- 如何使用SQLite将数据库中的值导出为C / C++中的字符串或字符?
- 如何轻松快速地存储大型单词数据库?
- 现有的数据库(最好是嵌入式数据库)是否支持大型小型多维搜索?