2016-12-01 87 views
0

我的迭代器代码:并行化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 

我试图申请并发:: parallel_for_each,但好像它不适合rocksdb API。

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

回答

1

我可能是错了,但我认为在岩石中的迭代器不是线程安全的,所以你需要使用每个线程一个迭代器。很显然,这是有道理的,你需要让每个迭代器在单独的数据范围内运行。

你既可以:

  1. 计数键的数量,然后由线程数分裂迭代器范围。我相信有一个函数来估计计数。

  2. 做一个初步扫描,并在如何瓜分你的钥匙范围决定

  3. 否则,如果你有你的钥匙范围内的一些预先知识,你可以决定如何分割,不做数据。

另外,如果你想迭代器都具有相同一致的看法,即如果也有发生,那么你应该采取一个快照,并创建你的迭代器并发写入。