并行化rocksdb迭代器

时间:2016-12-01 19:21:38

标签: 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 continue = callback(key, value);
    if (!continue) {
        break;
    }
}

迭代的顺序无关紧要,但打破循环非常重要,因此我们不会迭代不需要的元素。我使用的事实是元素按有意义的顺序排序,以了解何时中断。 callback可能需要很长时间。

所以我想做的伪代码是

parallel-iterate(iterator)
   if(!callback(key,value)
     stop-parallel

我尝试应用concurrency :: parallel_for_each,但似乎它不适合rocksdb api。

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

1 个答案:

答案 0 :(得分:1)

我可能会弄错,但我认为Rocks中的Iterators不是线程安全的,所以你需要为每个线程使用一个Iterator。显然,这有意义,你需要让每个迭代器在一个单独的数据范围内运行。

你可以:

  1. 计算键的数量,然后将迭代器范围除以线程数。我相信有一个估算计数的功能。

  2. 进行初步扫描并决定如何划分关键范围

  3. 否则,如果您对关键范围有一些预先了解,则可以决定如何拆分它们而不检查数据。

  4. 此外,如果您希望迭代器都具有相同的一致视图,即如果还发生了并发写入,那么您应该拍摄快照并从中创建迭代器。