我找了使用性LevelDB通过一键前缀来遍历来实现一键枚举的有效方式。最关键的是字节数组(和DB使用默认的字节数组比较器,因此与特定的前缀存储的所有按键/检索到的顺序),我想我的迭代器能够迈出了关键的前缀和具有键只返回数据字首。
我一定要使用或继承默认的数据库迭代器,力求在第一键范围(ofcourse我需要知道它是什么),然后验证,并返回所有以前缀开始切片(通过重写的MoveNext什么)?或者是有实现这种更有效的方法是什么?
让我知道是否有人已经解决了这个已经和可以共享代码或总体思路。我从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
}
}
}
我在my LevelDB wrapper前缀迭代器。
它是在通过startsWith
方法返回的范围内使用:
int count = 0;
for (auto& en: ldb.startsWith (std::string ("prefix"))) {++count;}