性LevelDB:实现一个迭代的关键前缀枚举

问题描述 投票:4回答:2

我找了使用性LevelDB通过一键前缀来遍历来实现一键枚举的有效方式。最关键的是字节数组(和DB使用默认的字节数组比较器,因此与特定的前缀存储的所有按键/检索到的顺序),我想我的迭代器能够迈出了关键的前缀和具有键只返回数据字首。

我一定要使用或继承默认的数据库迭代器,力求在第一键范围(ofcourse我需要知道它是什么),然后验证,并返回所有以前缀开始切片(通过重写的MoveNext什么)?或者是有实现这种更有效的方法是什么?

让我知道是否有人已经解决了这个已经和可以共享代码或总体思路。我从C ++ / CLI尝试这一点,但在任何语言的实现将有助于。

谢谢。 -raj。

iterator c++-cli leveldb
2个回答
3
投票

比较器是用来确定钥匙不同,所以超载它不会帮助,因为当你要扫描你必须要能够比较完整的钥匙(不只是前缀)的数据库 - 。重载迭代器是没有必要的:按键在性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

        }
    }
}

0
投票

我在my LevelDB wrapper前缀迭代器。 它是在通过startsWith方法返回的范围内使用:

int count = 0;
for (auto& en: ldb.startsWith (std::string ("prefix"))) {++count;}
© www.soinside.com 2019 - 2024. All rights reserved.