powered by simpleCommunicator - 2.0.30     © 2024 Programmizd 02
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Помогите пожалуйста размногопоточить процесс
12 сообщений из 12, страница 1 из 1
Помогите пожалуйста размногопоточить процесс
    #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
Помогите пожалуйста размногопоточить процесс
    #40096726
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Samantata
есть такой метод. принимает сет стрингов, возвращает мапу стрин-стринг. не важно как он ее делает. важно что процесс очень трудозатратный и поделить его можно только пополам, что я и делала.

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

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

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


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

ExecutorServiceExample не смотрел. Если не работает - дебажить надо ))). Но лично мне executor'ы не очень нравятся, мне кажется руками проще и понятнее.
...
Рейтинг: 0 / 0
Помогите пожалуйста размногопоточить процесс
    #40096728
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Samantata,
Выделите громоздкое в метод отдельный.
...
Рейтинг: 0 / 0
Помогите пожалуйста размногопоточить процесс
    #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
Помогите пожалуйста размногопоточить процесс
    #40096734
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Опять любитель асинхронности не может внятно рассказать чем занято два ядра процессора В ЕГО КОДЕ.
...
Рейтинг: 0 / 0
Помогите пожалуйста размногопоточить процесс
    #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
Помогите пожалуйста размногопоточить процесс
    #40096752
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это тоже не надо.

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



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


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

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

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


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

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

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

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


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