Должен ли я учитывать параллелизм в статистических вызовах? - PullRequest
4 голосов
/ 05 декабря 2010

мы собираемся внедрить программное обеспечение для различного статистического анализа на Java.Основная идея состоит в том, чтобы получить массив точек на графике, затем выполнить итерацию по нему и найти некоторые результаты (например, поиск самой длинной восходящей последовательности и различных индикаторов).

Проблема : много данных

Проблема 2 : также должна работать на ПК клиента, а не только на сервере (особая настройка сервера невозможна)

Частичное решение : выполнять вычисления в фоновом режиме ипусть пользователь смотрит на пустой экран в ожидании результата: (

Вопрос : есть ли способ как повысить производительность самих вычислений (много итераций), используя параллелизм? Если да, пожалуйста, предоставьте ссылки настатьи, образцы, все, что можно использовать здесь ...

Ответы [ 3 ]

3 голосов
/ 05 декабря 2010

Основной смысл использования параллельной обработки - наличие большого объема данных или больших вычислений , которые могут выполняться друг без друга . Например, вы можете посчитать факториал 10000 со многими потоками, разделив его на части 1..1000, 1001..2000, 2001..3000 и т. Д., Обработав каждую часть и затем накапливая результаты с *. С другой стороны, вы не можете разделить задачу вычисления большого числа Фибоначчи, так как более поздние зависят от предыдущего.

То же самое для больших объемов данных. Если вы собрали массив точек и хотите найти некоторые конкретные точки (больше, чем некоторая постоянная, максимум всего) или просто собрать статистическую информацию (сумма координат, количество вхождений), используйте параллельные вычисления. Если вам нужно собрать «текущую» информацию (самая длинная последовательность повышений) ... ну, это все еще возможно, но намного сложнее.

Разница между серверами и клиентскими ПК заключается в том, что на клиентских ПК не много ядер, а параллельные вычисления на одном ядре только снижают производительность, а не увеличивают . Поэтому не создавайте больше потоков, чем количество ядер пользовательских ПК (то же самое для вычислительных кластеров: не разбивайте задачу на большее количество подзадач, чем количество компьютеров в кластере).

MapReduce Hadoop позволяет эффективно создавать параллельные вычисления. Вы также можете искать более конкретные библиотеки Java, которые позволяют выполнять параллельную оценку. Например, Parallel Colt реализует высокопроизводительные параллельные алгоритмы для работы с большими матрицами, и существует множество таких библиотек для многих представлений данных.

2 голосов
/ 05 декабря 2010

В дополнение к тому, что сказал Роман, вы должны увидеть, имеет ли клиентский компьютер несколько ЦП / ядер ЦП / гиперпоточность. Если есть только один процессор с одним ядром и без гиперпоточности, вы не выиграете от распараллеливания вычислений. В противном случае это зависит от характера ваших вычислений.

Если вы собираетесь распараллеливать, обязательно используйте Java 1.5+, чтобы вы могли использовать API параллелизма. Во время выполнения определите количество ядер ЦП, например Runtime.getRuntime().availableProcessors(). Для большинства задач вы захотите создать пул потоков с таким количеством потоков, как Executors.newFixedThreadPool(numThreads), и передать задачи Исполнителю. Чтобы получить более конкретную информацию, вам нужно будет предоставить информацию о ваших конкретных вычислениях, как предложил Роман.

1 голос
/ 05 декабря 2010

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

Если есть много частей, которые должны вычисляться последовательно (то есть вы не можете вычислить вторую часть, пока не вычислена первая часть), тогда многопоточность не подходит.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...