wie man in Java Multiprocessing macht und welche Geschwindigkeit zu erwarten ist?

8

Ich bin ein Neuling, der Java verwendet, um Datenverarbeitung für CSV-Dateien durchzuführen. Dafür verwende ich die Multithreading-Fähigkeiten von Java (Pools von Threads), um die CSV-Dateien im Batch-Verfahren in Java zu importieren und einige Operationen für jede ihrer Zeilen auszuführen. Bei meinem Quad-Core beschleunigt Multithreading den Prozess sehr.

Ich bin gespannt, wie Multiprozessing die Operationen noch mehr beschleunigen würde? Wenn ja, gibt es irgendwo ein Tutorial? (Das Java Basic Tutorial erwähnt eine Klasse, aber ich kenne die Syntax nicht gut genug, um die Klasse selbst zu verstehen:

Ссылка :

  

Die meisten Implementierungen der Java Virtual Machine werden als einzelne ausgeführt   verarbeiten. Eine Java-Anwendung kann zusätzliche Prozesse mit einem erstellen   ProcessBuilder-Objekt. Multiprozessanwendungen sind nicht möglich   dieser Lektion [wo werden sie dann erklärt?] .

    
seinecle 03.11.2011, 21:16
quelle

6 Antworten

4
  

Ich bin gespannt, wie Multiprozessing die Operationen noch mehr beschleunigen würde?

Nein, es würde es wahrscheinlich noch schlimmer machen. Wenn Sie von Multithreading zu Multiprocessing wechseln würden, würden Sie die JVM mehrere Male starten. Das Starten einer JVM ist keine einfache Aufgabe. Tatsächlich unterscheidet sich die Art und Weise, wie die JVM auf Ihrem Desktop-Computer gestartet wird, von der Art und Weise, wie ein Unternehmen die JVM startet, um die Wartezeit für das Starten von Applets für den typischen Endbenutzer zu verkürzen.

    
Tim Bender 03.11.2011, 22:08
quelle
1

Jeder Entwickler sollte Verständnis für das Gesetz von Amdahl haben, um zu verstehen, wie sich die Multiprozessierung auf der Grundlage der gegebenen Bedingungen beschleunigen würde.

Das Amdahlsche Gesetz ist ein Modell für die Beziehung zwischen der erwarteten Beschleunigung parallelisierter Implementierungen eines Algorithmus relativ zum seriellen Algorithmus, unter der Annahme, dass die Problemgröße bei der Parallelisierung gleich bleibt.

Das ist eine gute Lektüre: Amdahls Gesetz

Amdahls Gesetz

    
java_mouse 03.11.2011 21:32
quelle
1

Die Verstärkung hängt davon ab, wie lange es dauert, die Daten zu mappen / zu reduzieren.

Wenn zum Beispiel die Dateien zu Beginn auf mehrere Maschinen geladen sind (denken Sie daran, als würden Sie das Dateisystem sharten), gibt es keine Verzögerung beim Abrufen der Daten. Wenn die Daten von einem einzigen Ort kommen, sind Sie durch diesen Mechanismus eingeschränkt.

Dann müssen die Daten kombiniert / aggregiert werden - nicht mehr zu wissen, unmöglich zu erraten. Wenn die gesamte Verarbeitung davon abhängt, dass alle Daten vorhanden sind, ist das ein höherer Treffer, als wenn die endgültigen Ergebnisse unabhängig voneinander berechnet werden können.

Sie haben eine sehr kleine Anzahl von sehr kleinen Dateien: es sei denn, was Sie tun, ist rechenintensiv, ich bezweifle, dass es die Mühe wert wäre, aber es ist schwer zu sagen. Unter der Annahme, dass keine Netzwerk- / Festplattenengpässe auftreten, erhalten Sie eine ( sehr ) ungefähr lineare Beschleunigung mit einem Delta für die Zusammenfassung der Ergebnisse. Die wahre Beschleunigung / Delta hängt von einer Reihe von Faktoren ab, über die wir zu diesem Zeitpunkt nicht viel wissen.

OTOH, du könntest ein kleines Hadoop-Setup einrichten und es einfach ausprobieren und sehen, was passiert.

    
Dave Newton 03.11.2011 22:50
quelle
1

Überprüfen Sie die Dokumente auf Ihrer JVM, um festzustellen, ob Multithreading unterstützt wird. Ich bin mir ziemlich sicher, dass die Sonne dies tut. Java Concurrency in Practice ist der richtige Startpunkt für Multithreading.

Der erste Teil Ihrer Frage lautet: Ist Multiprocessing dem Multithreading überlegen? In einem System mit robuster Multithreading-Unterstützung sollten Threads den Prozessen aus Leistungsperspektive immer überlegen sein. Es gibt mehr Isolation zwischen Threads (kein Shared Memory, es sei denn, es wurde explizit über einen IPC-Mechanismus eingerichtet). Daher sollten Sie die Multiprozessroute verwenden, um gefährliche Threads davon abzuhalten, aufeinander zu treten.

Für die Datenverarbeitung sollten Threads der beste Weg sein. Wenn Threads auf Ihrem lokalen Computer nicht ausreichen, würde ich eine Multiprozess-Lösung überspringen und direkt zu einem Map-Reduce-System wie Hadoop wechseln .

Warum Multiprozess-Apps erwähnt sind, denke ich, dass der Autor vollständig sein möchte. Obwohl kein Tutorial bereitgestellt wird, ist ein Link zu zusätzlicher Dokumentation vorhanden. Der große Nachteil von Multiprocessing besteht darin, dass Sie sich mit der Kommunikation zwischen Prozessen befassen müssen. Im Gegensatz zu Threads kannst du nicht einfach etwas Speicher freigeben und einige Mutexe um sie herum werfen und sie als Tag bezeichnen.

Aus den Kommentaren ergibt sich, dass es einige Verwirrung darüber gibt, was "Multiprocessing" eigentlich ist. Threads sind Konstrukte, die von Ihrem Code erstellt werden müssen. Es gibt APIs für die Erstellung und Verwaltung von Threads. Prozesse können jedoch manuell in der Befehlszeile erstellt werden. Führen Sie auf einer Unix-Box Folgendes aus, um vier Instanzen (Prozesse) von foo auszuführen. Beachten Sie, dass das letzte & erforderlich ist.

%Vor%

Wenn Sie jetzt eine Eingabedatei haben, die bar that foo verarbeiten muss, verwenden Sie etwas wie split , um es in vier gleiche Segmente aufzuteilen und foo darauf auszuführen:

%Vor%

Schließlich müssen Sie die bar.?.out -Dateien kombinieren. Ein solcher Test sollte Ihnen ein Gefühl dafür geben, ob die Verwendung von schwergewichtigen Prozessen eine gute Idee für Ihre Anwendung ist. Wenn Sie bereits eine Multithread-Anwendung erstellt haben, wird das wahrscheinlich gut funktionieren. Aber fühlen Sie sich frei, einige Experimente zu machen, um zu sehen, ob Prozesse besser funktionieren. Sobald Sie sicher sind, dass Prozesse der richtige Weg sind, reorganisieren Sie Ihren Code, um ProcessBuilder zu verwenden um die Prozesse selbst zu beschleunigen.

    
ObscureRobot 03.11.2011 21:20
quelle
1

Es gibt mehrere Möglichkeiten, einen neuen Prozess in Java zu starten:

  1. ProcessBuilder.start()
  2. Runtime.exec() funktioniert um %Code%
  3. Apache Commons Exec , das funktioniert um ProcessBuilder

Mit Runtime.exec() :

%Vor%

Mit ProcessBuilder :

%Vor%

Mit Apache Commons Exec:

%Vor%

Wichtige Unterschiede zwischen Multiprocessing und Multithreading aus :

  • Der Hauptunterschied zwischen Multiprocessing und Multithreading besteht darin, dass Multiprozessing einem System ermöglicht, mehr als zwei CPUs zum System hinzuzufügen, wohingegen Multithreading einen Prozess mehrere Threads generieren lässt, um die Rechengeschwindigkeit eines Systems zu erhöhen.
  • Das Multiprocessing-System führt mehrere Prozesse gleichzeitig aus, während das Multithreading-System mehrere Threads eines Prozesses gleichzeitig ausführen lässt.
  • Das Erstellen eines Prozesses kann Zeit beanspruchen und sogar die Systemressourcen erschöpfen. Das Erstellen von Threads ist jedoch ökonomisch, da Threads, die zu demselben Prozess gehören, die Eigenschaften dieses Prozesses teilen.
  • Multiprocessing kann in symmetrisches Multiprocessing und asymmetrisches Multiprocessing klassifiziert werden, wohingegen Multithreading nicht weiter klassifiziert wird.

Zusätzliche Links:

Eugene Lopatkin 11.01.2018 14:24
quelle
0

Multithreading hat in vielen Anwendungsfällen einen geringeren Overhead als Multiprocessing beim Vergleich eines Laappens eines Threads mit einem Launch eines Prozesses sowie beim Vergleich der Kommunikation zwischen Threads und der Kommunikation zwischen Prozessen.

Es gibt jedoch Szenarien, in denen Multithreading die Leistung bis zu einem Punkt herabsetzen kann, an dem ein einzelner Thread mehrere Threads übertrifft , z. B. Fälle, die stark von falsche Freigabe . Da bei Multiprocessing jeder Prozess über eigenen Speicherplatz verfügt, besteht keine Möglichkeit für eine falsche gemeinsame Nutzung und die Multiprocessing-Lösung kann die Multithreading-Lösung übertreffen.

Insgesamt sollte bei der Auswahl einer simultanen Programmierlösung eine Analyse durchgeführt werden, da die beste Lösung von Fall zu Fall variieren kann. Es kann nicht angenommen werden, dass Multi-Threading die Multi-Verarbeitung übertrifft, da es kontraintuitive Situationen gibt, in denen Multithreading schlechter abschneidet als ein einzelner Thread. Wenn Leistung eine große Rolle spielt, führen Sie Benchmarks durch, um Single-Thread-Einzelprozess- gegenüber Multithreading- oder Multiprocessing-Lösungen zu vergleichen und sicherzustellen, dass Sie wirklich die erwarteten Leistungsvorteile erhalten.

Kurz gesagt, gibt es neben der Leistung noch andere Überlegungen bei der Auswahl einer Lösung.

    
Hazok 19.11.2014 08:48
quelle

Tags und Links