我的迭代器代码:
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。
您如何建议实施并发迭代?
答案 0 :(得分:1)
我可能会弄错,但我认为Rocks中的Iterators不是线程安全的,所以你需要为每个线程使用一个Iterator。显然,这有意义,你需要让每个迭代器在一个单独的数据范围内运行。
你可以:
计算键的数量,然后将迭代器范围除以线程数。我相信有一个估算计数的功能。
进行初步扫描并决定如何划分关键范围
否则,如果您对关键范围有一些预先了解,则可以决定如何拆分它们而不检查数据。
此外,如果您希望迭代器都具有相同的一致视图,即如果还发生了并发写入,那么您应该拍摄快照并从中创建迭代器。