在Linux的Windows子系统中运行的Ubuntu上,最大的LMDB地图大小

时间:2018-11-03 17:51:37

标签: ubuntu windows-subsystem-for-linux lmdb

在创建新数据库之前,我通过其本机C mdb_env_set_mapsize()函数将LMDB的映射大小设置为5 GiB,并且该数据库和其他与数据库一起使用的LMDB函数的所有返回代码均表示成功。

但是,一旦我开始在LMDB环境中使用唯一的未命名数据库,则在数据库增长到1 GiB之后,我会收到“ map full”错误。

我使用free -m在bash窗口中检查了可用内存,发现使用了6.7 GiB的内存,而9.4 GiB是免费的。

我的直觉告诉我,这是操作系统问题,而不是LMDB问题。有谁知道我可以在哪里开始诊断(和修复)根本原因?

使用:

  • Windows 10版本。 1803,内部版本17134.345
  • Ubuntu版本。 WSL中的16.04
  • LMDB版本0.9.17-3
  • 16 GiB的物理内存

1 个答案:

答案 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 ...的快乐...