gpt4 book ai didi

c# - 为什么从 My BerkerleyDB HashDatabase 检索游标不是按升序排列

转载 作者:行者123 更新时间:2023-11-30 17:46:03 25 4
gpt4 key购买 nike

我在 Windows 上使用带有 C# 的 BerkerlyDB。我有一个 HashDatabase 例程,它使用 db.Put 添加 1 字节键和 1 字节数据对。问题是当我使用 cursor.movenext() 时,它们不会按升序出现。

                env = OpenEnv();
db = OpenDB(env, dBName);
byte[] rec1 = new byte[1];
rec1[0] = (byte)'D';
byte[] data = new byte[1] { 0 };
BDB.DatabaseEntry dbek1 = new BDB.DatabaseEntry(rec1);
db.Put(dbek1, new BDB.DatabaseEntry(data));
byte[] rec2 = new byte[1];
rec2[0] = (byte)'C';
BDB.DatabaseEntry dbek2 = new BDB.DatabaseEntry(rec2);
db.Put(dbek2, new BDB.DatabaseEntry(data));
cursor = db.Cursor();
while (cursor.MoveNext())
{
sb.Clear();
byte[] key = cursor.Current.Key.Data;
byte[] d = cursor.Current.Value.Data;
foreach (char c in key)
sb.Append(c);
sb.Append(' ');
foreach (int c in d)
sb.Append(c.ToString() + " ");
Console.WriteLine(sb.ToString());
}

private static BDB.HashDatabase OpenDB(BDB.DatabaseEnvironment env, string dbFileName)
{
BDB.HashDatabaseConfig hashConfig = new BDB.HashDatabaseConfig();
hashConfig.Env = env;
hashConfig.Duplicates = BDB.DuplicatesPolicy.SORTED;
hashConfig.Creation = BDB.CreatePolicy.IF_NEEDED;
hashConfig.PageSize = 4 * 4096;
hashConfig.FillFactor = (hashConfig.PageSize - 26) / (1 + 1 + 6);
// hashConfig.TableSize = 2000000;
return BDB.HashDatabase.Open(dbFileName, hashConfig);
}
private static BDB.DatabaseEnvironment OpenEnv()
{
BDB.MPoolConfig mpoolConfig = new BDB.MPoolConfig();
uint cacheSize = 2;
mpoolConfig.MaxCacheSize = new BDB.CacheInfo(cacheSize, 8192 * 4096, 1);
mpoolConfig.CacheSize = new BDB.CacheInfo(cacheSize, 4096 * 4096, 1);
BDB.MutexConfig mutexConfig = new BDB.MutexConfig();
mutexConfig.InitMutexes = 0;
mutexConfig.MaxMutexes = 0;
mutexConfig.Increment = 0;
BDB.DatabaseEnvironmentConfig envConfig = new BDB.DatabaseEnvironmentConfig();
envConfig.MPoolSystemCfg = mpoolConfig;
// envConfig.NoMMap = true;
envConfig.Private = true;
envConfig.Create = true;
envConfig.UseMPool = true;
envConfig.ForceFlush = true;
envConfig.MutexSystemCfg = mutexConfig;
return BDB.DatabaseEnvironment.Open(".", envConfig);
}

如有任何想法,我们将不胜感激。

最佳答案

是的,使用 DB_HASH 通过游标找到的记录将返回。

如果您希望通过游标排序,最简单的解决方法是从 DB_HASH 切换到 DB_BTREE,其中叶子总是排序的。 (但请注意,如果您使用的是整数键,则应为键使用网络/双序)。

否则,从哈希中检索后进行排序并非不可能。

关于c# - 为什么从 My BerkerleyDB HashDatabase 检索游标不是按升序排列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26779288/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com