在创建新数据库之前,我通过其本机C mdb_env_set_mapsize()
函数将LMDB的映射大小设置为5 GiB,并且该数据库和其他与数据库一起使用的LMDB函数的所有返回代码均表示成功。
但是,一旦我开始在LMDB环境中使用唯一的未命名数据库,则在数据库增长到1 GiB之后,我会收到“ map full”错误。
我使用free -m
在bash窗口中检查了可用内存,发现使用了6.7 GiB的内存,而9.4 GiB是免费的。
我的直觉告诉我,这是操作系统问题,而不是LMDB问题。有谁知道我可以在哪里开始诊断(和修复)根本原因?
使用:
答案 0 :(得分:0)
我几乎没有发表尴尬的答案……事实证明,这既不是操作系统也不是LMDB问题。导致最大地图大小为1 GiB的原始代码摘要为:
#include <unistd.h>
#include <lmdb.h>
int pageSize;
MDB_env *env;
pageSize = getpagesize(); /* OS-dependent number of bytes in a memory page */
mdb_env_create(&env);
mdb_env_set_mapsize(env, (int)(5*1024*1024*1024 / pageSize) * pageSize);
...
在最后一个函数中,出于舍入目的而出现的int
类型强制转换是罪魁祸首。将其更改为long int
可解决此问题。 C ...的快乐...