Основной смысл использования параллельной обработки - наличие большого объема данных или больших вычислений , которые могут выполняться друг без друга . Например, вы можете посчитать факториал 10000 со многими потоками, разделив его на части 1..1000, 1001..2000, 2001..3000 и т. Д., Обработав каждую часть и затем накапливая результаты с *
. С другой стороны, вы не можете разделить задачу вычисления большого числа Фибоначчи, так как более поздние зависят от предыдущего.
То же самое для больших объемов данных. Если вы собрали массив точек и хотите найти некоторые конкретные точки (больше, чем некоторая постоянная, максимум всего) или просто собрать статистическую информацию (сумма координат, количество вхождений), используйте параллельные вычисления. Если вам нужно собрать «текущую» информацию (самая длинная последовательность повышений) ... ну, это все еще возможно, но намного сложнее.
Разница между серверами и клиентскими ПК заключается в том, что на клиентских ПК не много ядер, а параллельные вычисления на одном ядре только снижают производительность, а не увеличивают . Поэтому не создавайте больше потоков, чем количество ядер пользовательских ПК (то же самое для вычислительных кластеров: не разбивайте задачу на большее количество подзадач, чем количество компьютеров в кластере).
MapReduce Hadoop позволяет эффективно создавать параллельные вычисления. Вы также можете искать более конкретные библиотеки Java, которые позволяют выполнять параллельную оценку. Например, Parallel Colt реализует высокопроизводительные параллельные алгоритмы для работы с большими матрицами, и существует множество таких библиотек для многих представлений данных.