А зачем? Чтобы не перегружать удалённую систему?valchkou wrote: 01 Mar 2018 05:40 проблема в том чтобы количество потоков можно было переконфигурить на лету.
Обойти неизвестной глубины дерево параллельно
-
- Уже с Приветом
- Posts: 13722
- Joined: 16 Jan 2001 10:01
Re: Обойти неизвестной глубины дерево параллельно
-
- Уже с Приветом
- Posts: 4195
- Joined: 27 Apr 2011 03:43
- Location: Сергели ->Chicago
-
- Уже с Приветом
- Posts: 1239
- Joined: 14 Nov 2002 23:02
- Location: S.Peterburg, Russia -->SoFla
Re: Обойти неизвестной глубины дерево параллельно
я сейчас очень похожую задачу пишу, только у меня не дерево, а граф, так что стейт сложнее. вначале один-в-один как у автора написала, но очень уж оно не сбалансровано все. в итоге по времени и по перформансу мне легче вышло вначале сделать легкий траверс графа (в лоб) собирая инфу для heavy lifting в какой-то мнее.. execution plan. а потом этот план уже параллельно запустить. так получилось больше контроля за балансом нагрузки на потоки. по времени выигрыш ~ в 4 раза в моем случае. но, понятно, что не всегда можно легкий траверс сделать, там как раз дьявол в деталях.
-
- Уже с Приветом
- Posts: 4195
- Joined: 27 Apr 2011 03:43
- Location: Сергели ->Chicago
Re: Обойти неизвестной глубины дерево параллельно
автор еще ничего не написал,
если я пойду первым путем то работа будет распределяться и распараллеливаться через
ArrayBlockingQueue<Node> queue;
с одной стороны я буду доставать и добавлять в эту очередь ноды
queue.put(node);
с другой же будет фиксированное количество потоков читающих из очереди
Node n = queue.take();
process(n)
что то типа этого
если я пойду первым путем то работа будет распределяться и распараллеливаться через
ArrayBlockingQueue<Node> queue;
с одной стороны я буду доставать и добавлять в эту очередь ноды
queue.put(node);
с другой же будет фиксированное количество потоков читающих из очереди
Node n = queue.take();
process(n)
что то типа этого
Code: Select all
package com.valchkou;
import javax.annotation.PostConstruct;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class TaskPubSub {
private int queueSize = 100;
private int workerSize = 4;
private ArrayBlockingQueue<Task> queue;
private ExecutorService taskExecutor;
public TaskPubSub () {
queue = new ArrayBlockingQueue<Task>(queueSize);
taskExecutor = Executors.newFixedThreadPool(workerSize);
subscribe();
}
/**
* Submit Task for processing or block if queue is full.
*/
public void submit(Task t) {
queue.put(t);
}
/**
* initialize working threads to process the queued items
*/
private void subscribe() {
for (int i=0; i< workerSize; i++) {
taskExecutor.submit(() -> {
while (true) {
Task t = queue.take();
process(t);
}
});
}
}
}
-
- Уже с Приветом
- Posts: 1494
- Joined: 08 Mar 2002 10:01
- Location: NJ
Re: Обойти неизвестной глубины дерево параллельно
Интересно, как этот план запоминается? Тоже дерево?Ann4Ann wrote: 01 Mar 2018 15:02 я сейчас очень похожую задачу пишу, только у меня не дерево, а граф, так что стейт сложнее. вначале один-в-один как у автора написала, но очень уж оно не сбалансровано все. в итоге по времени и по перформансу мне легче вышло вначале сделать легкий траверс графа (в лоб) собирая инфу для heavy lifting в какой-то мнее.. execution plan.
-
- Уже с Приветом
- Posts: 13722
- Joined: 16 Jan 2001 10:01
Re: Обойти неизвестной глубины дерево параллельно
По идее, если между обработкой листьев дерева нет зависимостей - план окажется простой: линейный список, или очередь...ALV00 wrote: 07 Mar 2018 00:37Интересно, как этот план запоминается? Тоже дерево?Ann4Ann wrote: 01 Mar 2018 15:02 я сейчас очень похожую задачу пишу, только у меня не дерево, а граф, так что стейт сложнее. вначале один-в-один как у автора написала, но очень уж оно не сбалансровано все. в итоге по времени и по перформансу мне легче вышло вначале сделать легкий траверс графа (в лоб) собирая инфу для heavy lifting в какой-то мнее.. execution plan.
-
- Уже с Приветом
- Posts: 1494
- Joined: 08 Mar 2002 10:01
- Location: NJ
Re: Обойти неизвестной глубины дерево параллельно
Что-то не осилил. Как из дерева получился список? В базах данных план выполнения это дерево.Palych wrote: 07 Mar 2018 02:19По идее, если между обработкой листьев дерева нет зависимостей - план окажется простой: линейный список, или очередь...ALV00 wrote: 07 Mar 2018 00:37Интересно, как этот план запоминается? Тоже дерево?Ann4Ann wrote: 01 Mar 2018 15:02 я сейчас очень похожую задачу пишу, только у меня не дерево, а граф, так что стейт сложнее. вначале один-в-один как у автора написала, но очень уж оно не сбалансровано все. в итоге по времени и по перформансу мне легче вышло вначале сделать легкий траверс графа (в лоб) собирая инфу для heavy lifting в какой-то мнее.. execution plan.
-
- Уже с Приветом
- Posts: 13722
- Joined: 16 Jan 2001 10:01
Re: Обойти неизвестной глубины дерево параллельно
Допустим дерево - это файлы в под-директориях. Нужно каждый переименовать.ALV00 wrote: 07 Mar 2018 05:11Что-то не осилил. Как из дерева получился список? В базах данных план выполнения это дерево.Palych wrote: 07 Mar 2018 02:19По идее, если между обработкой листьев дерева нет зависимостей - план окажется простой: линейный список, или очередь...ALV00 wrote: 07 Mar 2018 00:37Интересно, как этот план запоминается? Тоже дерево?Ann4Ann wrote: 01 Mar 2018 15:02 я сейчас очень похожую задачу пишу, только у меня не дерево, а граф, так что стейт сложнее. вначале один-в-один как у автора написала, но очень уж оно не сбалансровано все. в итоге по времени и по перформансу мне легче вышло вначале сделать легкий траверс графа (в лоб) собирая инфу для heavy lifting в какой-то мнее.. execution plan.
Тогда построение плана: нахождение каждого файла и отправка его во очередь на переименование.
-
- Уже с Приветом
- Posts: 6024
- Joined: 11 Mar 2011 05:36
-
- Уже с Приветом
- Posts: 18906
- Joined: 30 Aug 2001 09:01
- Location: 3rd planet
Re: Обойти неизвестной глубины дерево параллельно
Напоминает задачу определения порядка компиляции множественных проектов с зависимостями друг на друга.
Тупизна как Энтропия. Неумолимо растет.
-
- Уже с Приветом
- Posts: 1239
- Joined: 14 Nov 2002 23:02
- Location: S.Peterburg, Russia -->SoFla
Re: Обойти неизвестной глубины дерево параллельно
ну в итоге thread-am `отдается PriorityBlockingQueque. объекты в ней, правда, могут быть композитами. т.е. если развернуть, то таки дерево. priority помогает выполнение/ресурсы сбалансировать - в зависимости от точки входа в граф, даже для одного стейта графа планы разные собираются, не только по балансу, но и по объёму работ/данных/требуемых ресурсов (собс-но из за этой фичи и все затевалось).ALV00 wrote: 07 Mar 2018 00:37Интересно, как этот план запоминается? Тоже дерево?Ann4Ann wrote: 01 Mar 2018 15:02 я сейчас очень похожую задачу пишу, только у меня не дерево, а граф, так что стейт сложнее. вначале один-в-один как у автора написала, но очень уж оно не сбалансровано все. в итоге по времени и по перформансу мне легче вышло вначале сделать легкий траверс графа (в лоб) собирая инфу для heavy lifting в какой-то мнее.. execution plan.
получился приятный сайд-эффект : сейчас я уже этот план в базе сохранять могу (одна таблица), выяснилось, что очень удобно народу взять конкретный стейт. при этом новый траверс на живом графе уже может выдать другой план для той же точки входа.
-
- Уже с Приветом
- Posts: 15276
- Joined: 01 Mar 2007 05:18
- Location: VVO->ORD->DFW->SFO->DFW->PDX
Re: Обойти неизвестной глубины дерево параллельно
Это... прочитал только пару ответов, но... Это же обычный BFS - breadth first search. Ну а дальше - например, RxJava-й прикручиваем observeOn(workerThreadPool) ну и как только очередь пуста - onComplete() и типа обход завершен. Несколько строк же
Мат на форуме запрещен, блдж!