1

我的迭代器代码:

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。

你会如何建议实现并发迭代?

4

1 回答 1

2

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

您可以:

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

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

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

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

于 2016-12-02T13:02:07.583 回答