gpt4 book ai didi

iterator - LevelDB:实现一个迭代器以按键前缀进行枚举

转载 作者:行者123 更新时间:2023-12-02 19:34:30 26 4
gpt4 key购买 nike

我正在寻找一种有效的方法来使用 leveldb 来实现键枚举器以按键前缀进行迭代。键是字节数组(并且数据库使用默认字节数组比较器,因此具有特定前缀的所有键都按顺序存储/检索),我希望我的迭代器能够采用键前缀并仅返回具有该键的数据前缀。

我是否必须使用或继承默认的数据库迭代器,查找范围中的第一个键(当然我需要知道它是什么),然后验证并返回以前缀开头的每个切片(通过覆盖下一步什么的)?还是有更有效的方法来实现这一点?

如果有人已经解决了这个问题并可以分享代码或总体思路,请告诉我。我正在从 C++/CLI 尝试此操作,但以任何语言实现都会有所帮助。

谢谢。-raj。

最佳答案

比较器用于确定键是否不同,因此重载它不会有帮助,因为当您扫描数据库时,您必须能够比较完整的键(而不仅仅是前缀)。重载迭代器是没有必要的:键在 leveldb 中是排序的,你会知道如果遇到具有不同前缀的键,它已经超出了范围。您可以像平常一样使用迭代器,只要正确评估您的键,您就应该得到正确的结果:

void ScanRecordRange(const leveldb::Slice& startSlice, const leveldb::Slice& endSlice)
{
// Get a database iterator
shared_ptr<leveldb::Iterator> dbIter(_database->NewIterator(leveldb::ReadOptions()));

// Possible optimization suggested by Google engineers
// for critical loops. Reduces memory thrash.
for(dbIter->Seek(startSlice); dbIter->Valid() && _options.comparator->Compare(dbIter->key(), endSlice)<=0 ;dbIter->Next())
{
// Read the record
if( !dbIter->value().empty() )
{
leveldb::Slice keySlice(dbIter->key());
leveldb::Slice dataSlice(dbIter->data());
// TODO: process the key/data

}
}
}

关于iterator - LevelDB:实现一个迭代器以按键前缀进行枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10486102/

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