C++11 并行化rocksdb迭代器

C++11 并行化rocksdb迭代器,c++11,concurrency,iterator,parallel-for,rocksdb,C++11,Concurrency,Iterator,Parallel For,Rocksdb,我的迭代器代码: Iterator* iterator = _db->NewIterator(ReadOptions()); for (iterator->SeekToFirst(); iterator->Valid(); iterator->Next()) { Slice const& key = iterator->key(); Slice const& value = iterator->value(); bool

我的迭代器代码:

Iterator* iterator = _db->NewIterator(ReadOptions());
for (iterator->SeekToFirst(); iterator->Valid(); iterator->Next()) {
    Slice const& key = iterator->key();
    Slice const& value = iterator->value();
    bool continue = callback(key, value);
    if (!continue) {
        break;
    }
}
迭代的顺序并不重要,但是打破循环很重要,这样我们就不会迭代不需要的元素。我使用元素按有意义的顺序排序的事实来知道何时中断<代码>回调可能需要很长时间

所以我想做的伪代码是

parallel-iterate(iterator)
   if(!callback(key,value)
     stop-parallel
我尝试为每个应用并发::并行,但似乎不适合rocksdb api


您建议如何实现并发迭代?

我可能弄错了,但我认为Rocks中的迭代器不是线程安全的,因此您需要为每个线程使用一个迭代器。显然,为了使这一点有意义,您需要让每个迭代器在单独的数据范围内进行操作

你可以:

  • 计算键数,然后按线程数拆分迭代器范围。我相信有一个函数用于估计计数

  • 进行初始扫描,并决定如何划分关键范围

  • 否则,如果您对密钥范围有一些预先了解,则可以在不检查数据的情况下决定如何拆分它们

  • 此外,如果您希望迭代器都具有相同的一致性视图,即如果同时发生了写操作,那么您应该拍摄快照并从中创建迭代器