LMDB,覆盖了键值但 MDB_MAP_FULL
LMDB, overwrote the key-value but MDB_MAP_FULL
我了解 LMDB 使用写时复制策略。但是我怎样才能清理旧垃圾呢?我使用相同的键名覆盖了该项目,我希望以前的项目数据会自动删除,但似乎没有。我将地图大小设置为 10,485,760,并制作了一个大小为 4,194,304 的项目。该程序通过发出 MDB_MAP_FULL.
在第 3 次启动时崩溃
static void Main(string[] args)
{
using (LightningEnvironment env = new LightningEnvironment(@"d:\test"))
{
env.MapSize = 10485760;
env.MaxDatabases = 1;
env.Open();
using (var tx = env.BeginTransaction())
using (var db = tx.OpenDatabase("first", new DatabaseConfiguration { Flags = DatabaseOpenFlags.Create }))
{
byte[] data = new byte[1024 * 1024 * 4];
tx.Put(db, Encoding.UTF8.GetBytes("big"), data);
tx.Commit();
}
}
}
这意味着您尝试添加密钥时地图大小已满。当您尝试写入一个元素时,即使它是重复的,Lmdb mapsize 也会增加。因此,捕获地图大小已满的异常并将环境的地图大小增加大约 10 个百分比或任何因素并添加您要添加的元素
我了解 LMDB 使用写时复制策略。但是我怎样才能清理旧垃圾呢?我使用相同的键名覆盖了该项目,我希望以前的项目数据会自动删除,但似乎没有。我将地图大小设置为 10,485,760,并制作了一个大小为 4,194,304 的项目。该程序通过发出 MDB_MAP_FULL.
在第 3 次启动时崩溃static void Main(string[] args)
{
using (LightningEnvironment env = new LightningEnvironment(@"d:\test"))
{
env.MapSize = 10485760;
env.MaxDatabases = 1;
env.Open();
using (var tx = env.BeginTransaction())
using (var db = tx.OpenDatabase("first", new DatabaseConfiguration { Flags = DatabaseOpenFlags.Create }))
{
byte[] data = new byte[1024 * 1024 * 4];
tx.Put(db, Encoding.UTF8.GetBytes("big"), data);
tx.Commit();
}
}
}
这意味着您尝试添加密钥时地图大小已满。当您尝试写入一个元素时,即使它是重复的,Lmdb mapsize 也会增加。因此,捕获地图大小已满的异常并将环境的地图大小增加大约 10 个百分比或任何因素并添加您要添加的元素