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 の Iterator はスレッドセーフではないと思うので、スレッドごとに 1 つの Iterator を使用する必要があります。これを理解するには、それぞれの Iterator を別々のデータ範囲で操作する必要があります。

次のいずれかを実行できます。

  1. キーの数を数えてから、反復子の範囲をスレッドの数で分割します。カウントを推定する機能があると思います。

  2. 最初のスキャンを実行し、キー範囲を分割する方法を決定します

  3. それ以外の場合は、キー範囲についてある程度の知識があれば、データを調べずに分割方法を決定できます。

また、すべてのイテレータに同じ一貫したビューを持たせたい場合、つまり同時書き込みも発生している場合は、スナップショットを取得し、そこからイテレータを作成する必要があります。

于 2016-12-02T13:02:07.583 に答える