Как создать параллельный сплитератор из нескольких итераторов? - PullRequest
3 голосов
/ 13 февраля 2020

У меня есть список поддерживаемых курсором итераторов, которые возвращаются методом, который выполняет несколько запросов к базе данных.

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

List<Iterator<Article>> articleIterators = executeQuery();

Как бы я go о создании сплитератора? Предположим, что элементы в каждом итераторе упорядочены. Вполне возможно, что мое мышление в корне ошибочно.


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

1 Ответ

0 голосов
/ 14 февраля 2020

Вы можете попробовать Stream в abacus-util

List<Stream<Integer>> iters = IntStream.range(1, 32).mapToObj(it -> Stream.repeat(1, it).peek(Fn.sleep(3))).toList();

long startTime = System.currentTimeMillis();
Stream.concat(iters).sumInt(Integer::intValue);
System.out.println("Took: " + (System.currentTimeMillis() - startTime)); // print out: Took: 1535

iters = IntStream.range(1, 32).mapToObj(it -> Stream.repeat(1, it).peek(Fn.sleep(3))).toList();

startTime = System.currentTimeMillis();
Stream.parallelConcat(iters).sumInt(Integer::intValue);
System.out.println("Took: " + (System.currentTimeMillis() - startTime)); // print out: Took: 251

Отказ от ответственности: я являюсь разработчиком abacus-util .

...