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

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

Вы можете либо:

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

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

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

Кроме того, если вы хотите, итераторы имеют одинаковый последовательный вид, т.е. если были также параллельные операции записи происходит, то вы должны сделать снимок и создать итераторы от этого.