在 BerkeleyDB 中删除键值对
Delete a key-value pair in BerkeleyDB
有什么方法可以删除 BerkeleyDB 中键以 sub-string1 开头并以 sub-string2 结尾的键值对,而无需遍历数据库中的所有键?
例如:
$sub1 = "B015";
$sub2 = "5646";
我要删除
$key = "B015HGUJJ75646"
注意:$sub1和$sub2的组合保证只有一个key。
这可以通过获取数据库的迭代器并检查每个键的条件来完成,但这对于大型数据库来说效率非常低。有没有办法不用遍历整个数据库就可以做到这一点?
如果您使用的是 RECNO 数据库,那您可能就不走运了。但是,如果您可以使用 BTREE,那么您有几个选择。
首先,可能最简单的方法是仅迭代数据库中有意义的部分。假设您使用的是默认键比较函数,您可以使用 DB_SET_RANGE 将起始光标(迭代器)定位在部分键字符串的开头。在您的示例中,这可能是 "B0150000000000"
。然后,您使用 DB_NEXT 向前扫描,依次查看每个键。当您找到您正在寻找的密钥,或者您找到的密钥不是以 "B015"
开头时,您就完成了。
另一种可能适用于您的情况的技术是重新定义键比较函数。如果像您所说的那样,只有一种 $sub1 和 $sub2 的组合,那么也许您只需要比较键的那些部分以保证唯一性?这是来自 https://www2.informatik.hu-berlin.de/Themen/manuals/perl/DB_File.html :
的完整字符串比较示例(我假设您使用的是 perl,只是根据您上面提供的语法)
sub Compare
{
my ($key1, $key2) = @_ ;
"\L$key1" cmp "\L$key2" ;
}
$DB_BTREE->{compare} = 'Compare' ;
因此,如果您可以设置为仅比较开始和结束的四个字符,您应该能够将数据库迭代器直接放到您感兴趣的键上。
有什么方法可以删除 BerkeleyDB 中键以 sub-string1 开头并以 sub-string2 结尾的键值对,而无需遍历数据库中的所有键?
例如:
$sub1 = "B015";
$sub2 = "5646";
我要删除
$key = "B015HGUJJ75646"
注意:$sub1和$sub2的组合保证只有一个key。
这可以通过获取数据库的迭代器并检查每个键的条件来完成,但这对于大型数据库来说效率非常低。有没有办法不用遍历整个数据库就可以做到这一点?
如果您使用的是 RECNO 数据库,那您可能就不走运了。但是,如果您可以使用 BTREE,那么您有几个选择。
首先,可能最简单的方法是仅迭代数据库中有意义的部分。假设您使用的是默认键比较函数,您可以使用 DB_SET_RANGE 将起始光标(迭代器)定位在部分键字符串的开头。在您的示例中,这可能是 "B0150000000000"
。然后,您使用 DB_NEXT 向前扫描,依次查看每个键。当您找到您正在寻找的密钥,或者您找到的密钥不是以 "B015"
开头时,您就完成了。
另一种可能适用于您的情况的技术是重新定义键比较函数。如果像您所说的那样,只有一种 $sub1 和 $sub2 的组合,那么也许您只需要比较键的那些部分以保证唯一性?这是来自 https://www2.informatik.hu-berlin.de/Themen/manuals/perl/DB_File.html :
的完整字符串比较示例(我假设您使用的是 perl,只是根据您上面提供的语法) sub Compare
{
my ($key1, $key2) = @_ ;
"\L$key1" cmp "\L$key2" ;
}
$DB_BTREE->{compare} = 'Compare' ;
因此,如果您可以设置为仅比较开始和结束的四个字符,您应该能够将数据库迭代器直接放到您感兴趣的键上。