Collection Multithreading?

Status
Nicht offen für weitere Antworten.

Cheefrocker

Bekanntes Mitglied
hallo zusammen!°


Ich habe ein Collection. Momentan gehe ich hin und gehe jedes Element der collection durch und ruf die Methode Print von diesem Objekt auf. Das Ganze läuft in 1 Thread ab.

Wie kann ich das jetzt beschleunigen? Die Anwendung kann beispielsweise auf 1,2 oder 4 CPUs laufen.


Da die serielle Variante zu langsam ist wollte ich fragen wie ich diese jetzt paralelisieren kann?
 
T

tuxedo

Gast
Das Durchlaufen sollte doch schnell gehen. Wenn aber der Print-Aufruf zu viel Zeit braucht, kannst du diesen ja in einen Thread auslagern und während print noch ausgeführt wird in der Collection schon zum nächsten Eintrag springen.

- Alex
 

Cheefrocker

Bekanntes Mitglied
das problem ist, es macht nur sinn pro CPU 1 thread zu starten. bei 4 CPUS haben wir 4 nebenläufige Threads..

ich weiss nicht wie icheine sperre einbaue....
 
T

tuxedo

Gast
Java weiß AFAIk nicht wieviele Prozessoren oder CPU-Kerne das System hat. Ergo hast du auch nicht die möglichkeit das zu beschränken. Außerdem wüsste ich nicht wieso du nur exakt einen Thread pro CPU haben willst. Sobald du eine Swing-GUI hast hast du eh mehr als einen Thread.

- Alex
 

Cheefrocker

Bekanntes Mitglied
also bringt das mir nichts ? ja die gui läuft, aber die verarbeitung benötigt in dem Fall keine Gui. Anzahl an CPUS würde ich wie folgt ermitteln:

java.lang.Runtime.getRuntime().availableProcessors()
 
T

tuxedo

Gast
Okay, wieder was dazugelernt. Aber effektiv bringen tut's dir nix wenn du pro Kern/CPU einen Thread nimmst. Was hindert dich daran einfach 10 oder mehr Threads drauf los zu lassen? Woher hast du deine "seltsame" Eingebung 1-Thread-pro-CPU? Hast du nicht mal dran gedacht dass dein Betriebssystem schon etliche Threads und Prozesse laufen hat?

- Alex
 

-frank

Bekanntes Mitglied
hmm, probier doch einfach mal aus, ob es performancevorteile bringt. ich weiß nicht, ob sich deine collection während der print-aufgabe ändert bzw. wie es mit der reihenfolge aussieht, aber generell kannst du ja ganz einfach so viele threads erstellen wie prozessoren vorhanden sind und dann, wenn du zb 4 zur verfügung hast, 4 threads machen, die alle nur jedes 4. element printen. oder zb thread 1 von index 1-25 printen lassen, thread 2 von 26-50, etc.
 

-frank

Bekanntes Mitglied
alex0801 hat gesagt.:
Okay, wieder was dazugelernt. Aber effektiv bringen tut's dir nix wenn du pro Kern/CPU einen Thread nimmst. Was hindert dich daran einfach 10 oder mehr Threads drauf los zu lassen? Woher hast du deine "seltsame" Eingebung 1-Thread-pro-CPU? Hast du nicht mal dran gedacht dass dein Betriebssystem schon etliche Threads und Prozesse laufen hat?

- Alex

naja, für das thread management entsteht ein gewisser overhead. auf einem 1 kern prozessor wirds wohl etwas langsamer werden, wenn er zb 100 threads erzeugt anstatt eines einzelnen. also für mich klingt das logisch. (bin aber kein experte, also wenn ihr welche seid, vergesst es ;) )
 
T

tuxedo

Gast
Klar, der Overhead entsteht. Aber dennoch macht es Sinn für solche Sachen mehr als 1 Thread pro CPU zu verwenden. Und auch sollte klar sein dass man nicht beliebig viele Threads einsetzen sollte. Weil zu viel des guten war noch nie gut (da kommt dann der Overhead richtig zum tragen da der Dispatcher nur noch mit switchen beschäftigt ist).

Und noch ne kleine hypiothetische Frage am Rande: Wenn es so tragisch wäre mit dem Overhead und den Threads pro CPU: Wieso haben wir dann die ganzen vergangenen Jahre als wir Single-CPU Maschinen benutzt haben mit einem Multi-Threading/Tasking Betriebssystem gearbeitet?

- Alex
 

-frank

Bekanntes Mitglied
alex0801 hat gesagt.:
Und noch ne kleine hypiothetische Frage am Rande: Wenn es so tragisch wäre mit dem Overhead und den Threads pro CPU: Wieso haben wir dann die ganzen vergangenen Jahre als wir Single-CPU Maschinen benutzt haben mit einem Multi-Threading/Tasking Betriebssystem gearbeitet?

ist das nicht was anderes? ich meine, wir brauchen ja garnicht auf OS ebene zu gehen: selbst wenn ich nur will, dass irgendein wert alle paar sekunden überprüft wird, machts doch schon sinn, einen eigenen thread diese arbeit erledigen zu lassen. oder wie du ja selbst gesagt hast: wenns ne GUI gibt, hat man sowieso immer mehrere threads.
aber hier gings ja rein um die performance. wie kann es durch mehrere threads schneller werden?
 
T

tuxedo

Gast
Angenommen wir haben Thread A und Thread B

Beide solle so schnell wie möglich abgearbeitet werden.

Thread A hat Codezeilen die z.B. auf irgendwelche Ressourcen warten. Beispielsweise Netzwerk, Filesystem, ...

Thread B will nur was auf der Console ausgeben.

B braucht also (im normalfall) weniger Zeit als A.

Lässt man sie jetzt hintereinander laufen, addieren sich die Laufzeiten. Laufzeit von A + Laufzeit von B.

Lässt man beide gleichzeitig laufen so kommt man bei Laufzeit von A plus x raus, wobei x eine sehr kleine Zahl ist und für's switchen im Dispatcher und noch n bisschen Kleinkram steht.

Trotz dass die CPU immer nur eine Sache gleichzig tun kann, ist hier das Programm in der poarallelen verarbeitung mit Threads schneller weil der rest des Programms nicht von der "blockierenden Codezeile" in A ausgebremst wird. Die CPU hätte da eh nix zu tun, außer auf die Ressource zu warten. Und die Zeit kann man für andere Sachen, unter anderem B, nutzen.

Deshalb macht es Sinn trotz einer Single-CPU/Core Maschine mehrere Threads zu verwenden ...

- Alex
 

byte

Top Contributor
-frank hat gesagt.:
alex0801 hat gesagt.:
Aber dennoch macht es Sinn für solche Sachen mehr als 1 Thread pro CPU zu verwenden.

warum denn?
Weil es immer wieder Operationen gibt, wo die CPU warten muss (z.B. bei IO). In diesem Fall kannst Du auch auf einer CPU mit Multithreading Performance gut machen. Der Overhead durch den Scheduler fällt vergleichsweise gering aus.
Man sollte aber nicht zu viele Threads erzeugen und diese lieber bei Bedarf wiederverwenden (Stichwort: ThreadPools im Concurrency Framework).
 
T

tuxedo

Gast
-frank hat gesagt.:
wie kann es durch mehrere threads schneller werden?

Die CPU wird dadruch nicht schneller, aber ich kann Wartezeiten der CPU für andere Sachen ausnutzen. Und Wartezeiten hat man immer irgendwo. Manchmal mehr, manchmal weniger.

- Alex
 

-frank

Bekanntes Mitglied
alex0801 hat gesagt.:
-frank hat gesagt.:
wie kann es durch mehrere threads schneller werden?

Die CPU wird dadruch nicht schneller, aber ich kann Wartezeiten der CPU für andere Sachen ausnutzen. Und Wartezeiten hat man immer irgendwo. Manchmal mehr, manchmal weniger.

- Alex

alles klar. bei IO verstehe ich es. wie siehts aus wenn ich nur "intern" in meiner applikation arbeite --> also keine zugriffe auf das UserInterface, Eingabegeräte, Festplatten, etc. ich habe zb einfach nur einen Thread der irgendwelche zahlen ausrechnet. bringts dann trotzdem was?
 
T

tuxedo

Gast
geht ja nicht nur um das IO was einem sofort einfällt. Programme laufen hauptsächlich im RAM und auch da gibts zugriffszeiten. Okay, moderner Speicher hat da kleinste Nanosekunden. Aber der RAM wird ja auch noch vom OS/JVM verwaltet etc... Und das ist noch nicht das Ende vom Lied...

Hattest du Eingangs nicht irgendwas von "print" geschrieben? Auch das Ausdrucken auf der Console ist ein IO. Wenn du nur 10 Elemente in der Collection hast, dann wird's nicht viel bringen. Wenn du jetzt aber 100, 1000 oder noch mehr drin hast bringts sicher was.

Ob's jetzt 10%, 35.24% oder 56.234% schneller läuft kann dir heir keiner sagen. Das musst du ausprobieren.

- Alex
 
G

Guest

Gast
Die erset Frage, die sich stellt, ist, wo und warum geht die Zeit verloren?
Was macht die Print-Methode? Console-Ausgabe?

Wenn ja, dann kannst du an dieser Stelle mit der Optimierung ansetzen, indem du
die Ausgabe in einen Puffer (SrtingBuilder/StringBuffer) umleitest und z.B. alle
100 Aufrufe von Print den Puffer ausgibst. Console-Ausgabe ist immer sehr langsam.

Es macht keinen Sinn etwas zu optimieren, solange man nicht die Ursache genauer
lokalisiert hat.
 

Cheefrocker

Bekanntes Mitglied
Anonymous hat gesagt.:
Die erset Frage, die sich stellt, ist, wo und warum geht die Zeit verloren?
Was macht die Print-Methode? Console-Ausgabe?

Wenn ja, dann kannst du an dieser Stelle mit der Optimierung ansetzen, indem du
die Ausgabe in einen Puffer (SrtingBuilder/StringBuffer) umleitest und z.B. alle
100 Aufrufe von Print den Puffer ausgibst. Console-Ausgabe ist immer sehr langsam.

Es macht keinen Sinn etwas zu optimieren, solange man nicht die Ursache genauer
lokalisiert hat.

Die Print-Methode erstellt aus einem Frame(Inhalts eines JeditorPane) ein Image. Dieses Image wird dann in Tiff umgewandelt.

Detailierter:
Es wird in eine HTML-Seite in JeditorPane reingeladen. Der Inhalt des Jeditorpane wird dann als tiff abgespeichert. Dabei verwende ich Graphics2D




Die Print-Methode wird von 1-20000 mal oder mehr aufgerufen.


11000 Dateien erstellen dauert ca 10 Stunden.
 

Cheefrocker

Bekanntes Mitglied
Hier bissel Code:


Code:
  private void saveTiff(Graphics2D g) {
        /* Ab hier Tiff speichern */
        //dummyJob.cancel();
        BufferedImage bi = new BufferedImage(g.getClipBounds().width,
                g.getClipBounds().height, BufferedImage.TYPE_BYTE_BINARY);
        bi.getGraphics().fillRect(0,0, g.getClipBounds().width , g.getClipBounds().height);
        Graphics2D g2 = (Graphics2D)bi.createGraphics().create(0, 0,
                g.getClipBounds().width , g.getClipBounds().height);
        /* Das Bild zeichnen */
        this.paint(g2);
        /* Das Bild auf DIN A4 größe skalieren */
        Image img = bi.getScaledInstance(2480, 3508, bi.SCALE_FAST);
        BufferedImage buf2 = new BufferedImage( 2480, 3508, BufferedImage.TYPE_BYTE_BINARY);
        /* Das skalierte Bild in eine neues Grafikobjekt zeichnen */
        buf2.createGraphics().drawImage( img, 0 ,0, this);
        SimpleReadImage sr = new SimpleReadImage();
        try {
            sr.writeCompressedImage(saveToFile, sr.COMPRESS_CCITT4, buf2);
        } catch ( Exception e) {
            System.out.println(e);
        }
    }
 
T

tuxedo

Gast
DAS würde ich mit Threads auslagern, nachdem ich es weitestgehend optimiert habe ...

- Alex
 

Cheefrocker

Bekanntes Mitglied
ja das ist ja leider mein Problem! Wie lagere ich das in mehrere Threads aus, sodass sich das vielleicht je nach Anzahl der Prozesorren scalieren lässt...

Zur Zeit hab ich 1 Thread. und 1Forschleife die nach einander Savetiff aufruft.
 

Cheefrocker

Bekanntes Mitglied
Ich nutze noch Java 5. Aber es macht doch kein Sinn 11000 Threads oder mehr direkt nacheinander zu starten oder? Wäre nett wenn einer mir diese Frage beantworten kann.
 
M

maki

Gast
Die Print-Methode wird von 1-20000 mal oder mehr aufgerufen.


11000 Dateien erstellen dauert ca 10 Stunden.
Teile die Collection in so viele kleinere Collections auf, wie es Prozessoren gibt.
Lass für jede Collection einen Thread laufen, dass garantiert zwar nicht, das wirklich jeder Thread einen eigenen Prozessor bekommt, aber zumindest hast du dann nicht mehr Threads als Prozessoren.

Anosnten wäre das eine Aufgabe für einen Batch die im Hintergrund läuft.
 

byte

Top Contributor
Benutzt Du Java 5+ ? Dann ist der Fall prädestiniert für Executor/ ExecutorService aus dem Java Concurrency Framework. Obige Methode packst Du in ein Runnable. Dann holst Du Dir über Executors einen ThreadPool. Wenn Du pro CPU einen Thread haben willst, kannst Du z.B. Executors.newFixedThreadPool(anzahl) nehmen. Dem ExecutorService übergibst Du dann die Runnables zur Ausführung. Du brauchst nicht manuell Threads zu erzeugen. Der Service verwaltet alles selber.
 
T

tuxedo

Gast
Cheefrocker hat gesagt.:
Aber es macht doch kein Sinn 11000 Threads oder mehr direkt nacheinander zu starten oder?

Hat ja auch niemand behauptet... Zumal wir das glaube ich schonmal hatten von wegen "mit zu vielen Threads ist der dispatcher nur noch am switchen"..

byto's Vorschlag klingt doch super ...


- Alex
 

Cheefrocker

Bekanntes Mitglied
byto hat gesagt.:
Benutzt Du Java 5+ ? Dann ist der Fall prädestiniert für Executor/ ExecutorService aus dem Java Concurrency Framework. Obige Methode packst Du in ein Runnable. Dann holst Du Dir über Executors einen ThreadPool. Wenn Du pro CPU einen Thread haben willst, kannst Du z.B. Executors.newFixedThreadPool(anzahl) nehmen. Dem ExecutorService übergibst Du dann die Runnables zur Ausführung. Du brauchst nicht manuell Threads zu erzeugen. Der Service verwaltet alles selber.

Noch eine Frage: ich habe Methode in eine Runnable reinpacke. Wie baue ich die Schleife jetzt darein damit er immer andere Graphics2D Objekte laden kann?
 

byte

Top Contributor
Schreib Dir doch ne Klasse implements Runnable, der Du ein G2D im Konstruktor übergibst. Dann erzeugst Du nach und nach je Grafik ein Runnable und führst es per ExecutorService#submit nebenläufig aus.
 

Cheefrocker

Bekanntes Mitglied
Code:
   public void Multithread(Collection input)
    {
           
            Object[] t = input.toArray();  
            
            ExecutorService executor = Executors.newCachedThreadPool();
            Executors.newFixedThreadPool(2);
            
            for(int i=0;i<t.length;i++)
            {
                test2 n = new test2(t[i],new File("C:\\Dokumente und Einstellungen\\xv\\Desktop\\Neuer Ordner (2)\\"));
                executor.execute(n);
            }
            
               
    }


meinste in Etwa so?


test2 ist dann meine Klasse wo saveTiff aufgerufen wird?
 

tfa

Top Contributor
Cheefrocker hat gesagt.:
Code:
            ExecutorService executor = Executors.newCachedThreadPool();
            Executors.newFixedThreadPool(2);

Warum das newCachedThreadPool()? So sollte es sein:
Code:
            ExecutorService executor =  Executors.newFixedThreadPool(2);
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Rakshan Generic reading of XML document from the root tag into an Collection Allgemeine Java-Themen 0
JavaJüngling beliebige Collection die Comperable Elemente enthält als Parameter Allgemeine Java-Themen 37
W Collections Suche Collection, um Strings mit Indizees versehen Allgemeine Java-Themen 47
I Collection - contains-Methode überschreiben (anonyme innere Klasse) Allgemeine Java-Themen 4
Y String-Collection: längste gemeinsame Strings / Prefixe Allgemeine Java-Themen 3
S Probleme mit Collection Allgemeine Java-Themen 7
S Passende Java Collection Allgemeine Java-Themen 5
D Eigene/r Collection/Container Allgemeine Java-Themen 3
K Collections Collection<> mit List<String> abgleichen? Allgemeine Java-Themen 10
D Beste Collection für Integer Allgemeine Java-Themen 4
H JPA (EclipseLink) Neuer Eintrag in Collection speichern (unidirektional) Allgemeine Java-Themen 3
M Collections Typ Variable einer generischen Collection ? Allgemeine Java-Themen 4
T Garbage Collection Frage Allgemeine Java-Themen 15
H Datentypen Collection für SQL-Datentypen Allgemeine Java-Themen 2
M collection persistence system Allgemeine Java-Themen 4
K associate collection with two open sessions Allgemeine Java-Themen 12
B Garbage Collection Logfile: Binary File Allgemeine Java-Themen 2
T Liste mit GregorianCalendar-Objekten in List einlesen, mit Collection sortieren und ausgeben Allgemeine Java-Themen 3
S Stilfrage bezüglich Beans mit Collection-Properties Allgemeine Java-Themen 2
B iText Portable Collection Acrobat X Allgemeine Java-Themen 2
S Eine Collection von Objekten mit LDAP Syntax filtern Allgemeine Java-Themen 5
Rudolf Aus Collection<Integer> eine Zahl machen Allgemeine Java-Themen 2
R Dateigestützte Collection für große Datenmengen Allgemeine Java-Themen 5
hdi Garbage Collection Allgemeine Java-Themen 12
P Collection Tree Allgemeine Java-Themen 19
C Die schnellste Collection-Klasse ? Allgemeine Java-Themen 37
K Collection.contains()/retainAll() mit Referenzgleichheit statt equals()? Allgemeine Java-Themen 2
W return Collection mit schleife durchsuchen Allgemeine Java-Themen 10
E Collection Problem Allgemeine Java-Themen 2
B Geordnete, begrenzte Collection Allgemeine Java-Themen 3
D [SOLVED] Collection wird nicht richtig per Konstruktor übernommen Allgemeine Java-Themen 8
S Wahl der Collection, unspezifizierte Elementtypen Allgemeine Java-Themen 4
D Map mit Collection Eigenschaften Allgemeine Java-Themen 9
T Objekt der Garbage Collection zugaenglich machen? Allgemeine Java-Themen 7
S Innerer Type einer generischen Collection herausfinden? Allgemeine Java-Themen 13
B SBCC - Swing Better Components Collection - downloadlink ? Allgemeine Java-Themen 5
G Schnelligkeit einer Collection Allgemeine Java-Themen 12
V Collection in Collection Allgemeine Java-Themen 3
W [solved] Vector sortieren (Collection / Comparable?) Allgemeine Java-Themen 7
M Collection aufteilen Allgemeine Java-Themen 4
S Collection Type Allgemeine Java-Themen 8
S Probleme mit collection.containsAll Allgemeine Java-Themen 28
F Frage zu Memory Leak, Garbage Collection und Profiler-Tools Allgemeine Java-Themen 6
vogella Überschreiben von equals und hashcode für Collection Allgemeine Java-Themen 7
T Hibernate Criteria Queries - Abfragen von Collection-Members Allgemeine Java-Themen 2
M Schnellste Collection/Liste Allgemeine Java-Themen 15
M Collection mit ArrayList Allgemeine Java-Themen 17
F mittels Collection<A> an A.class kommen? Allgemeine Java-Themen 7
L Welche Collection ist die richtige ? Listen mergen Allgemeine Java-Themen 3
B Collection Allgemeine Java-Themen 2
M Wie lange dauert ein garbage collection Allgemeine Java-Themen 7
R Garbage Collection bei gegenseitiger Objektreferenz Allgemeine Java-Themen 2
N Collection#retainAll(Collection<?> c) Allgemeine Java-Themen 3
M garbage collection Allgemeine Java-Themen 14
G Frage zur Garbage Collection Allgemeine Java-Themen 5
R Objekttyp ermitteln das aus generischer Collection kommt Allgemeine Java-Themen 3
J Von Collection zu vector Allgemeine Java-Themen 5
P Welche Collection verwenden? Allgemeine Java-Themen 4
S Sortierung einer Collection nach dem Attribut "name&quo Allgemeine Java-Themen 3
C Collection Element ersetzen Allgemeine Java-Themen 5
C public boolean containsAll(Collection c) Allgemeine Java-Themen 2
C Collection, LinkedList, Elemente Allgemeine Java-Themen 4
W Multithreading Alphabet Allgemeine Java-Themen 3
T Multithreading: Wie viele Threads sollte ich erstellen? Allgemeine Java-Themen 12
J Threads Multithreading Allgemeine Java-Themen 15
K Multithreading plattform übergreifend? Allgemeine Java-Themen 3
R Bruteforce hashes mit multithreading. Funktioniert das so? Allgemeine Java-Themen 0
B Threads Multithreading Threads sollen warten Allgemeine Java-Themen 12
K Multithreading: Service(Task), wait und continue Allgemeine Java-Themen 21
M JUnit & Multithreading - sehr seltener Fehler Allgemeine Java-Themen 3
C Ressourcensparendes Multithreading Allgemeine Java-Themen 3
A Multithreading mit JButtons Allgemeine Java-Themen 5
S Threads Multithreading- langsamer als Singlethreading-Programm Allgemeine Java-Themen 6
D Threads Multithreading Allgemeine Java-Themen 25
A MultiThreading.. Scheduling-Problem? Allgemeine Java-Themen 10
M Multithreading Problem Allgemeine Java-Themen 3
dayaftereh Multithreading Allgemeine Java-Themen 16
E Multithreading and volatile Allgemeine Java-Themen 10
J Wie die gleichzeitige Ausführung mehrerer Tasks trotz Multithreading verhindern? Allgemeine Java-Themen 2
G multithreading, concurrency conveyor belt beispiel Allgemeine Java-Themen 2
A Problem mit Zufallszahlen und Multithreading Allgemeine Java-Themen 14
I Problem mit Multithreading Allgemeine Java-Themen 4
H Singleton und MultiThreading [erledigt] Allgemeine Java-Themen 3
O Multithreading mit Java 5 u den Concurrency APIs Allgemeine Java-Themen 7
O Multithreading und Multiprozessor Allgemeine Java-Themen 4
K Multithreading bei statischen Methoden Allgemeine Java-Themen 2
T ungewöhnliche Exception (Multithreading und JList) Allgemeine Java-Themen 10
K Frage zu ProgressBars, Algorithmen und Multithreading ->F Allgemeine Java-Themen 2
flashfactor Multithreading-Problem Allgemeine Java-Themen 4

Ähnliche Java Themen


Oben