2016-12-01 12 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

私は間違いかもしれませんが、RocksのIteratorsはスレッドセーフではないと思いますので、スレッドごとに1つのIteratorを使用する必要があります。明らかにこれを理解するには、各イテレーターを個別のデータ範囲で操作する必要があります。

あなたは可能性があり、次のいずれか

  1. キーの数をカウントして、スレッドの数によってイテレータ範囲を分割します。私はカウントを見積もる機能があると信じています。

  2. は、初期スキャンを行うと、そうでない場合は、あなたのキー範囲

  3. を分割する方法を決定し、あなたがあなたのキー範囲のいくつかの事前の知識を持っている場合は、データを調べることなく、それらを分割する方法を決定することができます。あなたがしたい場合にも、そのスナップショットを取ると、それとは、あなたのイテレータを作成する必要が発生した同時書き込みがあった場合

また、全てのイテレータはすなわち、同じ一貫性のあるビューを持っています。

関連する問題