2016-12-01 88 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. 否則,如果你有你的鑰匙範圍內的一些預先知識,你可以決定如何分割,不做數據。

另外,如果你想迭代器都具有相同一致的看法,即如果也有發生,那麼你應該採取一個快照,並創建你的迭代器併發寫入。