Распараллелить итератор rockdb

Мой код итератора:

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.

Как бы вы предложили реализовать параллельную итерацию?


person Mugen    schedule 01.12.2016    source источник


Ответы (1)


Я могу ошибаться, но я думаю, что итераторы в Rocks не являются потокобезопасными, поэтому вам нужно будет использовать один итератор на поток. Очевидно, чтобы это имело смысл, вам нужно, чтобы каждый итератор работал с отдельным диапазоном данных.

Вы можете:

  1. Подсчитайте количество ключей, а затем разделите диапазоны итераторов на количество потоков. Я считаю, что есть функция для оценки количества.

  2. Выполните первоначальное сканирование и решите, как разделить диапазон ключей.

  3. В противном случае, если у вас есть некоторые предварительные знания о вашем диапазоне ключей, вы можете решить, как их разделить, не изучая данные.

Кроме того, если вы хотите, чтобы все итераторы имели одинаковое согласованное представление, т. е. если также происходила одновременная запись, вам следует сделать снэпшот и создать из него свои итераторы.

person adamretter    schedule 02.12.2016