hubouvie@microsoft.com wrote:
Hi everyone,
We’ve been stress‑testing an LMDB database by continually inserting and deleting records ranging from 4 KB to 5 MB. To track utilization, we rely on two independent metrics: Application index – we track the sum of the payload bytes of keys currently present. mdb_stat output – pages in use /overlay etc.... The two figures agree closely.
Despite this, we repeatedly hit MDB_MAP_FULL when both metrics say the map is only ≈ 50 % occupied (on both metrics). Our tentative conclusion is heavy page fragmentation: LMDB can’t find a sufficiently large contiguous run of free pages even though half of the map is nominally free. Questions
- Is it normal to lose that much effective capacity with an insert/delete workload like ours?
Yes. LMDB is not meant for write intensive workloads, it's for read-heavy workloads.
- How far can we realistically fill the map before hitting fragmentation limits?
- Are there recommended ways to mitigate or “defragment”?
The only way is to make a new copy of the environment, e.g. using mdb_env_copy().
Any advice would be greatly appreciated!
Thanks! Hugues