Гость
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Помогите пожалуйста размногопоточить процесс / 12 сообщений из 12, страница 1 из 1
10.09.2021, 14:43
    #40096721
Samantata
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста размногопоточить процесс
есть такой метод. принимает сет стрингов, возвращает мапу стрин-стринг. не важно как он ее делает. важно что процесс очень трудозатратный и поделить его можно только пополам, что я и делала.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
private Map<String, String> makeAdreses() {
    
        Map<String, String> adresWhisW = new ConcurrentHashMap();
        Thread thread = new Thread(new IndexedRandomThread(adresWhisW));
        thread.start();
        for (int i = 0; i < 1000; i++) {
                t=//громоздкие вычисления которые нельзя разделить на части;
            adresWhisW( t, i);
        }
 
        try {
            thread.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return adresWhisW;
    }
 
 
    public class IndexedRandomThread implements Runnable {
        private Map<String, String> outputMap;
 
        public IndexedRandomThread(Map<String, String> outputMap) {
            this.outputMap = outputMap;
        }
 
        @Override
        public void run() {
            for (int i = 1000; i < 2000; i++) {
                t=//громоздкие вычисления которые нельзя разделить на части
            outputMap.put( t, i);
 
            }
        }
    }


все работало пока у процессора было 2 ядра.
а потом их стало 32 и программа теперь нагружает машину на 2%.

Подсказали надо использовать экзекьютор. Я пытаюсь. Но опыта с ним нет. то что я пишу
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
package used;
 
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.*;
 
public class ExecutorServiceExample {
    int countYader = 4;
    public static Map<String, String> adresWhisW = new ConcurrentHashMap();
    CountDownLatch[] cdl = new CountDownLatch[countYader];
 
    public static void main(String args[]) {
        Set<String> ss = new HashSet();
 
        ss.add("вася");
        ss.add("петя");
        ss.add("вася1");
        ss.add("петя1");
        ss.add("вася2");
        ss.add("петя2");
 
        new ExecutorServiceExample(ss);
 
        System.out.println(adresWhisW.size() + "-size");
        for (Map.Entry<String, String> entry : adresWhisW.entrySet()) {
            System.out.println(entry.getKey() + " " + entry.getValue());
        }
 
    }
 
    ExecutorServiceExample(Set<String> ss) {
 
        for (int tr = 0; tr < countYader; tr++) {
            cdl[tr] = new CountDownLatch(6);
        }
 
        ExecutorService executor;
        executor = Executors.newFixedThreadPool(1);
 
        for (int tr = 0; tr < countYader; tr++) {
            executor.execute(new MyThread(cdl[tr], ss, adresWhisW));
        }
        
        try {
            for (int tr = 0; tr < countYader; tr++) {
 
                System.out.println("*");
                cdl[tr].await();
                System.out.println("***");
 
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        
        executor.shutdown();
 
    }
 
    public class MyThread implements Runnable {
        CountDownLatch latch;
        private Set<String> strSet;
        private Map<String, String> outputMap;
 
        public MyThread(CountDownLatch c, Set<String> strSet, Map<String, String> outputMap) {
            latch = c;
            this.strSet = strSet;
            this.outputMap = outputMap;
            new Thread(this);
        }
 
        @Override
        public void run() {
            for (String str : strSet) {
                str = str + str; //тут будет мнооого вычислений
                outputMap.put(str, str);
                latch.countDown();
            }       
        }
    }
 
}


не работает. просто запускает одно и тоже несколько раз.
Как это делается по человечески?
Заранее спасибо :)
...
Рейтинг: 0 / 0
10.09.2021, 15:15
    #40096726
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста размногопоточить процесс
Samantata
есть такой метод. принимает сет стрингов, возвращает мапу стрин-стринг. не важно как он ее делает. важно что процесс очень трудозатратный и поделить его можно только пополам, что я и делала.

Если поделить можно только пополам, то непонятно, что Вы хотите достигнуть.

"Поделено пополам" на мой взгляд крайне странно (с точки зрения кода).

При взгляде на код, складывается ощущение, что
Код: java
1.
        for (int i = 0; i < 1000; i++) {


поделить можно минимум в 1000 раз

ExecutorServiceExample не смотрел. Если не работает - дебажить надо ))). Но лично мне executor'ы не очень нравятся, мне кажется руками проще и понятнее.
...
Рейтинг: 0 / 0
10.09.2021, 15:20
    #40096728
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста размногопоточить процесс
Samantata,
Выделите громоздкое в метод отдельный.
...
Рейтинг: 0 / 0
10.09.2021, 15:26
    #40096732
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста размногопоточить процесс
Samantata
не работает. просто запускает одно и тоже несколько раз.


Код: java
1.
2.
3.
        for (int tr = 0; tr < countYader; tr++) {
            executor.execute(new MyThread(cdl[tr], ss, adresWhisW));
        }


А почему должно быть разное, если для нескольких заданий/потоков параметр ss одинаковый?

Код: java
1.
        executor = Executors.newFixedThreadPool(1);



Создается executor в ОДИН поток, потом какое-то непонятное шаманство с countYader. Что такое и зачем CountDownLatch мне даже представить сложно, я с таким не сталкивался.
JavaDocnewFixedThreadPool(int nThreads)
Creates a thread pool that reuses a fixed number of threads operating off a shared unbounded queue.

Скорее должно быть что-то наподобии, в countYader обрабатываем поштучно строки из коллекции ss (правильность синтаксиса не гарантирую)
Код: java
1.
2.
3.
4.
        executor = Executors.newFixedThreadPool( countYader );
        for ( String myOneString : ss ) {
            executor.execute(new MyThread(cdl[tr], myOneString, adresWhisW));
        }



IMHO могу ошибаться
...
Рейтинг: 0 / 0
10.09.2021, 15:28
    #40096734
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста размногопоточить процесс
Опять любитель асинхронности не может внятно рассказать чем занято два ядра процессора В ЕГО КОДЕ.
...
Рейтинг: 0 / 0
10.09.2021, 16:02
    #40096750
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста размногопоточить процесс
Не нравится мне эта мапа.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
 @Override
        public void run() {
            for (String str : strSet) {
                str = str + str; //тут будет мнооого вычислений
                outputMap.put(str, str);
                latch.countDown();
            }       
        }



Зачем ее передавать в каждый поток если нас не интересует никакое промежуточное состояние
мапы аж до финала процесса.

Мы можем возвращать временную мапу в конце каждого потока (в виде Callable)
и таким образом убираем лишний объект синхронизации.

Код: java
1.
2.
3.
class SamantaThread implements Callable<Map<String, String>> {
    .....
}
...
Рейтинг: 0 / 0
10.09.2021, 16:04
    #40096752
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста размногопоточить процесс
Это тоже не надо.

Код: java
1.
latch.countDown();



Когда реализуешь callable - там будет нормальный барьер ожидания финала всех рабочих futures.get
...
Рейтинг: 0 / 0
10.09.2021, 16:21
    #40096758
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста размногопоточить процесс
Код: java
1.
2.
все работало пока у процессора было 2 ядра.
а потом их стало 32 и программа теперь нагружает машину на 2%.


Тут - вообще непонятно какая ставится цель. Цель обычно - не грузить процессор
а быстро закончить бизнес-процесс.

Чтоб его быстро закончить надо не просто что-то там параллелить а понять где не самом
деле узкое место.

Код: java
1.
                t=//громоздкие вычисления которые нельзя разделить на части


Не буду спорить по поводу чего там можно делить или нет. Но в первую очередь
надо понять профиль нагрузки. Что узкое место. Вычисления. Или сеть. Или диск.
В случае ноутбучного диска - увеличивать число тредов - бесполезно. Станет только хуже.

Есть роскошный плакат который нарисовал Шипилев.
https://shipilev.net/talks/devoxx-Nov2012-perfMethodology-mindmap.pdf

Там есть гипотезы по нагрузке - и им соответсвтующие утилиты которые проверяют действие этих гипотез.
Бери плакат и смотри на своё приложение через эти знания.
...
Рейтинг: 0 / 0
10.09.2021, 17:39
    #40096787
Samantata
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста размногопоточить процесс
всем огромное спасибо. вопрос решился. просто порезала сет на куски и каждый отправила в свой thread. может не красиво, но помогло :)
авторТут - вообще непонятно какая ставится цель. Цель обычно - не грузить процессор
а быстро закончить бизнес-процесс.

Чтоб его быстро закончить надо не просто что-то там параллелить а понять где не самом
деле узкое место.
скорость обработки данных меняется же ))
...
Рейтинг: 0 / 0
10.09.2021, 17:42
    #40096791
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста размногопоточить процесс
Экстремум нашла? При каком числе newFixedThreadPool(...) время минимально?
...
Рейтинг: 0 / 0
10.09.2021, 17:48
    #40096796
Samantata
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста размногопоточить процесс
x2 от кол-ва ядер хорошо идет. но это не точно. надо исследовать) Но уже гораааааздо лучше чем было :)
...
Рейтинг: 0 / 0
10.09.2021, 17:55
    #40096801
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста размногопоточить процесс
Исследуй. Очень мало алгоритмов реально параллелятся на ядрах.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Помогите пожалуйста размногопоточить процесс / 12 сообщений из 12, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]