как сделать многопроцессорную обработку в java, и какой прирост скорости ожидать?

Я новичок, использующий Java для обработки данных в csv-файлах. Для этого я использую многопоточные возможности Java (пулы потоков) для пакетного импорта csv-файлов в Java и выполнения некоторых операций над каждой из их строк. На моем четырехъядерном ядре многопоточность значительно ускоряет процесс.

мне любопытно узнать, как / будет ли многопроцессорная обработка ускорять операции еще больше? Если да,то есть ли где-нибудь учебник? (учебник по Java Basic упоминает класс, но я недостаточно знаком с синтаксисом, чтобы понять класс самостоятельно:

от http://download.oracle.com/javase/tutorial/essential/concurrency/procthread.html:

большинство реализаций виртуальной машины Java выполняются как одна процесс. Приложение Java может создавать дополнительные процессы с помощью Объект ProcessBuilder. Многопроцессорные приложения выходят за рамки в этом уроке [где они объяснил тогда?].

6 ответов


Мне любопытно узнать, как / будет ли многопроцессорная обработка еще больше ускорять операции?

нет, на самом деле это, вероятно, усугубит ее. Если бы вы переключились с многопоточности на многопроцессорность, вы бы эффективно запустили JVM несколько раз. Запуск JVM-это не простое усилие. Фактически, способ запуска JVM на вашем настольном компьютере отличается от способа запуска JVM корпоративной компанией, Просто чтобы сократить время ожидания апплетов запуск для обычного конечного пользователя.


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

закон Амдала является моделью для связи между ожидаемым ускорением распараллеленных реализаций алгоритма относительно последовательного алгоритма, в предположении, что размер проблемы остается тем же при распараллеливании.

Это хорошее чтение : закон Амдала

Amdahl закон!--8-->


прирост определяется как долго это берет, чтобы карту/уменьшить данные.

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

затем данные должны быть объединены / агрегированы-не зная больше, невозможно догадаться. Если вся обработка зависит от наличия всех данных, это выше, чем при конечные результаты могут быть рассчитаны независимо.

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

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


проверьте документы на JVM, чтобы узнать, поддерживает ли он многопоточность. Я почти уверен, что солнечные. Параллелизм Java На Практике это место, чтобы начать для многопоточности.

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

для обработки данных потоки должны быть лучшим способом. Если потоков на вашем локальном компьютере недостаточно, я бы пропустил многопроцессорное решение и пошел прямо к системе map-reduce, такой как Hadoop.

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


из комментариев кажется, что есть некоторая путаница в том, что такое "многопроцессорная обработка" на самом деле. Потоки-это конструкции, которые должны быть созданы вашим кодом. Существуют API для создания потоков и управления ими. Процессы, однако, могут быть созданы вручную в командной строке. В окне unix выполните следующие действия для запуска четырех экземпляров (процессов)foo. Обратите внимание, что окончательный - это.

$ ./foo & ./foo & ./foo & ./foo &

теперь, если у вас есть входной файл, bar что foo нужно обработать, использовать что-то вроде split разбить его на четыре равных сегмента и запустить foo на:

$ ./foo bar.0 > bar.0.out & ./foo bar.1 > bar.1.out & ./foo bar.2 > bar.2.out & ./foo bar.3 > bar.3.out &

наконец, вам нужно будет объединить bar.?.out файлы. Запуск такого теста должен дать вам некоторое представление о том, является ли использование тяжелых процессов хорошей идеей для вашего приложения. Если вы уже создали многопоточное приложение, это, вероятно, будет просто отлично. Но не стесняйтесь проводить некоторые эксперименты, чтобы увидеть, если процессы работают лучше. Как только вы убедитесь, что процессы-это путь, реорганизуйте свой код для использования ProcessBuilder запустить процессы самостоятельно.


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

, существуют сценарии, в которых многопоточность может снизить производительность до такой степени, что один поток превосходит несколько потоков, например, случаи, сильно затронутые ложного совместного использования. С многопроцессорной обработкой, так как каждый процесс имеет свое собственное пространство памяти, нет никаких шансов на ложное совместное использование, и многопроцессорное решение может превзойти многопоточное решение.

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

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


существует несколько способов запуска нового процесса в Java:

  1. ProcessBuilder.start()
  2. Runtime.exec() работает ProcessBuilder
  3. Apache Commons Exec работает около Runtime.exec()

С ProcessBuilder:

ProcessBuilder pb =
new ProcessBuilder("myCommand", "myArg1", "myArg2");
Map<String, String> env = pb.environment();
env.put("VAR1", "myValue");
env.remove("OTHERVAR");
env.put("VAR2", env.get("VAR1") + "suffix");
pb.directory(new File("myDir"));
File log = new File("log");
pb.redirectErrorStream(true);
pb.redirectOutput(Redirect.appendTo(log));
Process p = pb.start();
assert pb.redirectInput() == Redirect.PIPE;
assert pb.redirectOutput().file() == log;
assert p.getInputStream().read() == -1;

С Runtime:

Runtime r = Runtime.getRuntime();
Process p = r.exec("firefox");
p.waitFor(10, TimeUnit.SECONDS);
p.destroy();

С Apache Commons Exec:

String line = "AcroRd32.exe /p /h " + file.getAbsolutePath();
CommandLine cmdLine = CommandLine.parse(line);
DefaultExecutor executor = new DefaultExecutor();
int exitValue = executor.execute(cmdLine);

ключевые различия между многопроцессорной и Многопоточность из этой:

  • ключевое различие между многопоточностью и многопоточностью заключается в том, что многопоточность позволяет системе иметь более двух процессоров, добавленных в систему, в то время как многопоточность позволяет процессу генерировать несколько потоков для увеличения вычислительной скорости системы.
  • многопроцессорная система выполняет несколько процессов одновременно, в то время как многопоточная система позволяет выполнять несколько потоков процесса одновременно.
  • создание процесса может потреблять время и даже исчерпать системные ресурсы. Однако создание потоков экономично, поскольку потоки, принадлежащие одному и тому же процессу, разделяют имущество этого процесса.
  • Multiprocessing можно расклассифицировать в симметричную multiprocessing и несимметричную multiprocessing тогда как, multithreading не расклассифицировано более далее.

дополнительные ссылки: