wie zu tun multiprocessing in java, und was Geschwindigkeitssteigerungen zu erwarten?
Ich bin ein Neuling mit Java zu tun, einige Verarbeitung der Daten auf csv-Dateien. Für die Verwendung des multithreading-Fähigkeiten von Java (Becken des threads), um batch-import der csv-Dateien in Java und führen Sie einige Operationen auf jede Ihrer Linien. Auf meinem quad-core, Multi-Threading beschleunigt den Prozess viel.
Ich bin neugierig zu wissen, wie/ob das Rendern beschleunigen würde, die Operationen noch? Wenn ja, gibt es da ein tutorial irgendwo? (die Java Basic Tutorial erwähnt, eine Klasse, aber ich bin nicht vertraut genug mit der syntax zu verstehen, die Klasse von mir:
vom http://download.oracle.com/javase/tutorial/essential/concurrency/procthread.html:
Meisten Implementierungen der Java virtual machine laufen als eine einzige
Prozess. Eine Java-Anwendung erstellen können zusätzliche Prozesse mit ein
ProcessBuilder-Objekts. Multiprozess-Anwendungen sind über den Umfang
in dieser Lektion [wo sind Sie, erklärte dann?].
- Sind Sie auf der CPU-bound oder I/O-gebunden? Festplatten sind deutlich langsamer als die Prozessoren. Plus, threads sind in der Regel leichter zu wechseln, zwischen und zum Austausch von Daten zwischen als Prozesse. Wenn Ihr Programm ständig warten, für die Festplatte, es ist nicht die Materie eine ganze Menge so oder so.
- Ich habe eine Warteschlange von Dutzenden von csv-Dateien zu importieren in meine java-Anwendung. Ich benutze einen pool von threads (sieben threads, genau) zu importieren, die Sie schneller als einer nach dem anderen - im moment kann ich importieren 7 csv-Dateien "auf einmal" - eine pro thread. Könnte ich beschleunigen dies noch mehr mit multiprocessing? Eine wie ist multiprocessing nützlich für die Parallelität auf einem einzelnen computer im Allgemeinen?
- Normalerweise finde ich, dass Sie sich verbessern können die Leistung der single-thread viel mehr als der nur 4x (am besten Sie hoffen kann, für 4 Kerne, wenn die CPU gebunden ist) würde ich sicherstellen, dass Sie gründlich profiliert und optimiert den code Ihre erste.
- Ich wäre neugierig zu wissen, diese tricks, aber ich werde öffnen Sie eine neue Diskussion dafür 😉
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nein, in der Tat würde es wahrscheinlich noch schlimmer machen. Wenn Sie wechseln von multithreading multiprocessing, dann würde man effektiv starten der JVM mehrere Male. Das starten der JVM ist keine einfache Aufwand. In der Tat, die Art, wie die JVM auf Ihrem desktop-Rechner startet, ist Verschieden von der Weise, wie ein Unternehmen Unternehmen beginnt Ihre JVM, nur eine Verkürzung der Wartezeit für applets zu starten, die für die typische end-user.
Jeder Entwickler sollte über einige Kenntnisse über Amdahl ' s Gesetz zu verstehen, wie die multi-Verarbeitung beschleunigen würde, auf der Grundlage der gegebenen Bedingungen.
Amdahl ' s Gesetz ist ein Modell für die Beziehung zwischen der erwarteten Beschleunigung von parallelisierte Implementierungen eines Algorithmus gegenüber dem seriellen Algorithmus unter der Annahme, dass das problem die Größe bleibt die gleiche, wenn parallelisiert.
Dies ist eine gute Lektüre : Amdahl ' s Gesetz
Amdahl ' s law
Die Verstärkung wird dadurch bestimmt, wie lange es dauert, bis Karte/reduzieren Sie die Daten.
Wenn, zum Beispiel, die Dateien werden geladen, auf mehreren Maschinen zu beginnen (denken Sie daran, wie Splitter die Datei system), es gibt keine Verzögerung abrufen der Daten. Wenn die Daten kommen von einem einzigen Standort aus, Sie beschränkt sich durch diesen Mechanismus.
Dann die Daten kombinierte/aggregierte-man weiß nicht mehr, unmöglich zu erraten. Wenn die gesamte Verarbeitung hängt davon ab, dass alle Daten, es ist eine höher schlagen, als wenn die ultimative Ergebnisse können berechnet werden, unabhängig.
Haben Sie eine sehr kleine Zahl von sehr kleinen Dateien: es sei denn, was Sie tun, ist rechnerisch teuer, ich bezweifle es wäre die Mühe Wert, aber es ist schwer zu sagen. Vorausgesetzt, es ist kein Netzwerk - /Datenträger-Engpässen erhalten Sie eine (sehr) annähernd linearer speedup mit einem delta für die Aggregation der Ergebnisse. Die wahre speedup/delta hängt von einer Reihe von Faktoren, die wir nicht viel wissen darüber an dieser Stelle.
OTOH, Sie könnte die Einrichtung eines kleinen Hadoop-setup und versuchen Sie es einfach und sehen, was passiert.
Überprüfen Sie die Dokumente auf Ihrem JVM, um zu sehen, ob es unterstützt multithreading. Ich bin mir ziemlich sicher, die Sonne do. Java Concurrency In Practice ist der Ort, um zu starten für multithreading.
Den ersten Teil deiner Frage ist: ist multiprocessing überlegen multithreading, aus performance-Sicht? In einem system mit robustem multithreading-Unterstützung, threads sollten immer überlegen sein Verfahren, aus einer performance-Sicht. Es ist mehr eine Trennung zwischen den threads (kein shared memory, soweit nicht ausdrücklich setup über eine IPC-Mechanismus), so möchten Sie vielleicht gehen die Multiprozess-route zum halten gefährlicher threads treten auf einander.
Zur Verarbeitung der Daten, threads sollte sein, den besten Weg zu gehen. Wenn threads, die auf Ihrer lokalen Maschine sind nicht genug, ich würde überspringen Vergangenheit eine Multiprozess-Lösung und gehen Sie direkt zu einem map-reduce-system wie Hadoop.
Warum Multiprozess-apps sind erwähnt, ich denke, der Autor will, vollständig zu sein. Obwohl ein tutorial ist nicht vorhanden, einen link zur Dokumentation. Der große Nachteil der Verwendung von multiprocessing ist, dass man sich mit inter-Prozess-Kommunikation. Im Gegensatz zu threads, Sie können nicht nur teilen, etwas Speicher und werfen einige Mutexe um ihn herum und nennen es einen Tag.
Ab in die Kommentare, es scheint, dass es einige Verwirrung darüber, was "multiprocessing" eigentlich ist. Threads sind Konstrukte, die geschaffen werden müssen, durch Ihren code. Gibt es APIs für die thread-Erstellung und-management. Prozesse, obwohl, die erstellt werden können, von hand auf der Kommandozeile. Auf einem unix-Rechner gehen Sie zum ausführen von vier Instanzen (Prozesse)
foo
. Beachten Sie, dass die endgültige&
erforderlich ist.Nun, wenn Sie einen input-Datei
bar
dass foo verarbeiten muss, verwenden Sie so etwas wiesplit
zu brechen Sie in vier gleich große Segmente, und führen Siefoo
drauf:Schließlich, werden Sie brauchen, um zu kombinieren die
bar.?.out
- Dateien. Läuft eine Prüfung wie diese, sollten Sie etwas Gefühl für, ob die Verwendung der schwergewichtigen Prozesse ist eine gute Idee für Ihre Anwendung. Wenn Sie bereits gebaut, ein multi-threaded-Anwendung, wird das wohl in Ordnung sein. Aber fühlen Sie sich frei, um einige Experimente, um zu sehen, wenn Prozesse besser funktionieren. Sobald Sie sicher sind, dass Prozesse sind der Weg zu gehen, organisieren Sie Ihre code verwenden ProcessBuilder zu drehen bis die Prozesse selbst.Es gibt mehrere Möglichkeiten, einen neuen Prozess starten, der in Java:
ProcessBuilder.start()
Laufzeit.exec()
arbeitet rund umProcessBuilder
Runtime.exec()
Mit
ProcessBuilder
:Mit
Runtime
:Mit Apache Commons Exec:
Wichtigsten Unterschiede zwischen Multiprocessing und Multithreading von diese:
Weiterführende links:
Für viele Anwendungsfälle, multithreading, hat weniger Aufwand als das multiprocessing beim Vergleich der Laichzeit einen thread vs erzeugen eines Prozesses als auch der Vergleich Kommunikation zwischen threads vs inter-Prozess-Kommunikation.
Jedoch es gibt Szenarien, in denen die multithreading-Leistung beeinträchtigen kann, zu dem Punkt, wo ein einzelner thread übertrifft mehrere threads, wie Fälle stark betroffen von false-sharing. Mit multiprocessing, da jeder Prozess hat seinen eigenen Speicherbereich es gibt keine Wahrscheinlichkeit für false sharing auftreten und die multiprocessing-Lösung kann besser abschneiden als der multithreading-Lösung.
Insgesamt einige Analyse durchgeführt werden sollte, wenn die Wahl eines concurrent programming Lösung, da Sie die beste Performance-Lösung kann variieren auf einer Fall-zu-Fall-basis. Multithreading kann nicht davon ausgegangen werden, übertreffen die multiprocessing-da gibt es offensichtlich Situationen, in denen multithreading führt schlimmer, als ein einzelner thread. Wenn die Leistung ist ein wichtiger Aspekt, führen benchmarks zu vergleichen, single-thread, single-process vs. multithreading vs multiprocessing-Lösungen, um sicherzustellen, dass Sie wirklich gewinnt die performance-Vorteile, die erwartet werden.
Einen kurzen Hinweis, gibt es andere überlegungen neben der Leistung bei der Auswahl einer Lösung.