Darstellung der Liste bei vielen Daten extrem langsam

Crasher

Mitglied
Hi @ all,

mein Problem lässt sich einfach erklären, aber nicht ganz so einfach beheben. "Zumindest nicht von mir :)".

Ich habe eine JList, in der Daten dargestellt werden. Die Daten werden aus einem CSV-File gelesen, sortiert und anschließend in die Liste geschrieben. Da das Programm später aber mit 20.000 bis 50.000 Datensätzen arbeiten muss, habe ich mit 20.000 Datensätzen einen Test gestartet. Nun ist es aber so, dass das hHinzufügen zur Liste ziehmlich lange dauert (1-3 min). Das tritt aber nur sporadisch auf und einen genauen Weg zur Reproduktion konnte ich noch nicht feststellen.

Hier meine Methode, die meine Daten zur Liste hinzufügt:
Java:
public void showTrains(){
    this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
    readCSV("data/trains/collection/trainCollection.csv");
    closeBufferedReader();
    model.clear();
    sortData.clear();

    if(isEmpty == false){
      try{
        //Züge in sortData schreiben
        for(int i = 0;i<(cast.length);i++){
          sortData.add(train[i][0]);
        }

        //Die Züge sortieren
        Collections.sort(sortData, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return Integer.valueOf(o1).compareTo(Integer.valueOf(o2));
            }
        });

        //Sortierung der Züge in der Liste darstellen
        for(Iterator it = sortData.iterator(); it.hasNext();){
          model.addElement(it.next().toString());
        }

      }catch(Exception e){
        JOptionPane.showMessageDialog(this, "Fehler beim Hinzufügen der Züge zur Liste.", "Es is ein Fehler aufgetreten!", JOptionPane.ERROR_MESSAGE);
        ErrorLog errorLogging = new ErrorLog();
        errorLogging.writeErrorLog(e.toString());
      }
    }
    this.setCursor(Cursor.getDefaultCursor());
  }

Kurze Erläuterung unbekannter Faktoren:
  • Die Variable isEmpty gibt an, ob die Liste überhaupt nachgeladen werden muss. (Habe ich zur
    Einschränkung der Perfomancebelastung eingebaut)
  • model ist in dem Fall mein DefaultListModel
  • sortData meine ArrayList, die die zu sortierenden Daten enthält
  • Methode readCSV, liest die CSV aus und schreibt alle Daten in einen Array

Hoffe es kann mit jemand von euch helfen. Ich komme an der Stelle nämlich nicht mehr weiter.
Vor allem da der Fehler nur sporadisch auftritt.

Vielen Dank schonmal im Voraus.

Greetz
Crasher
 

Marco13

Top Contributor
Hm. Was dauert lange? Das Sortieren, oder das Einfügen? Es könnte schon helfen, ein neues Model zu erstellen, das dann zu füllen, und DANN erst in die Liste zu packen. Die Liste ist als Listener am Modell, und kriegt jede Änderung mit und aktualisiert sich dann...
 

Crasher

Mitglied
Hi,

ich kann Dir leider nicht genau sagen, ob es an der Sortierung oder am Hinzufügen zur Liste liegt.
Habe es eben ausprobiert, beim Hinzufügen ein neues Model zu erstellen und dann dieses zu verwenden.
Das Problem bleibt aber.

Java:
public void showTrains(){
    this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
    readCSV("data/trains/collection/trainCollection.csv");
    closeBufferedReader();
    sortData.clear();

    if(isEmpty == false){
      try{
        //Züge in sortData schreiben
        for(int i = 0;i<(cast.length);i++){
          sortData.add(train[i][0]);
        }

        //Die Züge sortieren
        Collections.sort(sortData, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return Integer.valueOf(o1).compareTo(Integer.valueOf(o2));
            }
        });

        DefaultListModel newModel = new DefaultListModel();
        trainList.setModel(newModel);

        //Sortierung der Züge in der Liste darstellen
        for(Iterator it = sortData.iterator(); it.hasNext();){
          newModel.addElement(it.next().toString());
        }

      }catch(Exception e){
        JOptionPane.showMessageDialog(this, "Fehler beim Hinzufügen der Züge zur Liste.", "Es is ein Fehler aufgetreten!", JOptionPane.ERROR_MESSAGE);
        ErrorLog errorLogging = new ErrorLog();
        errorLogging.writeErrorLog(e.toString());
      }
    }
    this.setCursor(Cursor.getDefaultCursor());
  }

Danke.

Greetz
Crasher
 

Crasher

Mitglied
Ich vermute, ich weiß woran es hängt:
ich habe mr während dem Programmablauf mal den Windows Task-Manager angeschaut und festgestellt, dass der Speicher des Programms bei jedem aufrufen der showTrains() Methode weiter steigt. Ergo nehme ich mal an, dass der Speicher nicht wieder gelöscht wird.

Beim ersten aufruf der Methode läuft nämlich noch alles Prima.
Beim zweiten Aufruf der Methode schon nicht mehr.

Jetzt stellen sich aber drei Fragen:
1. Wo haben die Daten noch Referenzen in meinem Programm?
2. Warum haben die Daten noch Referenzen in meinem Programm?
Und 3. wie räume ich den Speicherplatz wieder frei.
 

Wortraum

Bekanntes Mitglied
> 1. Wo haben die Daten noch Referenzen in meinem Programm?
Wo Du die Objekte noch verwendest, weißt Du am besten. ;)

> 2. Warum haben die Daten noch Referenzen in meinem Programm?
Warum Du die Objekte noch verwendest, weißt Du am besten. ;)

> Und 3. wie räume ich den Speicherplatz wieder frei.
Eigentlich gar nicht, dafür gibt es die Speicherbereinigung; und spätestens, wenn das Programm keinen weiteren Speicher anfordern kann, wird sie Speicher freigeben. Du kannst ihr mit System.gc() sagen, daß sie aufräumen soll, aber Dein Problem solltest Du anders lösen.
 

Meldanor

Bekanntes Mitglied
Also:
Meine Vermutung ist die von Marco13:
Mache ein ganz neues Model und packe die Sachen darein und dann weißt du der Tabelle das Model zu. Das hinzufügen zum Model braucht nicht lange dauern, aber wenn du was hinzufügtst, registriert die Tabelle das und aktualisiert sich und zeichnet sich neu. Und ich schätze, dieses Neuzeichnen und sonstige Operationen benötigen so lange.
Was du nämlich jetzt hast, ist das selbe. Du machst ein neues Model, fügst es hinzu und addest dann einzeln die Züge.
Mach aber lieber ein neues Model, füge die Züge hinzu und adde das Model der List.

Der Speicheranstieg ist hingegen in Ordnung. Es ist sogar wichtig, dass der GC jetzt nicht anspringt, weil das Laden dann NOCH länger braucht.

Der GC springt eh erst an, wenn ein Objekt keine Referenz mehr hat UND Speicher benötigt wird(hast du im Heap [isses der Heap ? kA] noch 500 MB frei, springt er nicht an).Denn die Suche nach icht referenzierten Objekten als auch das freigeben verbraucht wieder Leistung und das eine "Menge".
 

Marco13

Top Contributor
Es kann auch sein, dass der Speicher knapp wird, und er dann so mit Hin- und Herschaufeln beschäftigt ist, dass es so lange dauert (zumindest KANN die Ausführung extrem(!) langsam werden, wenn der Speicher knapp wird). Starte dein Programm mal mit
java -Xmx500m MeinProgramm
und schau ob das Problem weiterhin besteht. Ansonsten müßtes du mal einen Profiler anwerfen. Oder einen Debugger/Memory Leak Detector, FALLS du glaubst, dass irgendwo Referenzen rumliegen, die es nicht mehr geben sollte.
 

LoR

Bekanntes Mitglied
Nun ist es aber so, dass das Hinzufügen zur Liste ziehmlich lange dauert (1-3 min). Das tritt aber nur sporadisch auf...

Das Problem hatte ich vor einiger Zeit auch.

Ich habe die Sache dann genauer untersucht und festgestellt, dass dafür die offensichtlich ineffiziente Implementierung des
Java:
DefaultListModel
verantwortlich ist.

Nachdem ich eine eigene Implementierung geschrieben hatte tratt das Problem nie wieder auf und das Laufzeitverhalten wurde auch massiv gesteigert. Weshalb Sun so etwas ausliefert(e) ist mir bis heute unklar.

Zur Lösung:
Schreibe eine eigene Implementierung eines
Java:
ListModel
. Das ist übrigens sehr einfach.
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Das DefaultListModel delegiert eigentlich nur an einen Vector. Wie deine "effizientere" Implementierung aussieht, würde mich jetzt schon mal interessieren ;)
 

LoR

Bekanntes Mitglied
Vom Prinzip her:

1. Nicht jedesmal ein event "feuern", wenn ein Element hinzugefügt wird. Hier hilft eine Bulk-Implementierung wie z.B setCollection(...) oder addCollection(...) und danach das event auslösen.
2. ArrayList oder LinkedList statt Vector verwenden.

Vorallem Punkt 1. ist für die beschriebenen Performanceprobleme verantwortlich.
 

Marco13

Top Contributor
Der erste Punkt ist das, was ich schon in meiner ersten Antwort erwähnt hatte. Eine spezielle Implementierung zu verwenden, die solche bulk-Operationen anbietet wäre dann nochmal eine Optimierung, man muss dann halt ein bißchen aufpassen dass man nicht Änderungen macht, über die jemand benachrichtigt werden sollte, aber nicht wird, weil die bulk-Methoden verwendet werden...
 

LoR

Bekanntes Mitglied
Der erste Punkt ist das, was ich schon in meiner ersten Antwort erwähnt hatte.

Hast recht. Hab es eben erst gelesen. Offensichtlich hat er aber deine Antwort nicht verstanden.

Eine spezielle Implementierung zu verwenden, die solche bulk-Operationen anbietet wäre dann nochmal eine Optimierung, man muss dann halt ein bißchen aufpassen dass man nicht Änderungen macht, über die jemand benachrichtigt werden sollte, aber nicht wird, weil die bulk-Methoden verwendet werden...

Ja.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
E XML - Datei Darstellung in IntelliJ als Baum Allgemeine Java-Themen 2
G Darstellung von Text auf MapContext von GeoTools Allgemeine Java-Themen 2
Zrebna Alternative Darstellung eines Codesnippets Allgemeine Java-Themen 33
J Unicode Darstellung mit 5 chars Allgemeine Java-Themen 9
W Baumstrukturmodell -> Darstellung als TreeView Allgemeine Java-Themen 5
I Fehler bei HashMaps Darstellung Allgemeine Java-Themen 10
krgewb Darstellung bei Java-Update Allgemeine Java-Themen 8
O Darstellung von else if anweisung im struktogramm? Allgemeine Java-Themen 1
F Framework/Plugin für Tree-Darstellung in Graph Allgemeine Java-Themen 0
N Best Practice Flexible String-Darstellung Allgemeine Java-Themen 1
R Bibliothek für Darstellung von char auf 5x7 Dot-Matrix Allgemeine Java-Themen 2
G REST- Object darstellung Allgemeine Java-Themen 6
G Darstellung von Ergebnissen einer Dokumentensuche über eine JTable Allgemeine Java-Themen 19
K Javamail:Probleme mit der Darstellung von Umlaute in Subject Allgemeine Java-Themen 15
D Problem bei der Darstellung einer trigonometrischen Funktion Allgemeine Java-Themen 2
O Problem bei Darstellung der Laufzeit eines Programms Allgemeine Java-Themen 3
C Swing JComboBox - Problem mit der Darstellung des Inhaltes Allgemeine Java-Themen 9
I Teilweise falsche Darstellung jap. Zeichen im JEditorPane mit RTFEditorKit aus RTF-Datei Allgemeine Java-Themen 5
B Darstellung bei verschieden win Systeme spinnt! Allgemeine Java-Themen 2
X CATIA Konstuktionsdaten Import- Darstellung Allgemeine Java-Themen 4
S Darstellung einer dynamischen Matrix Allgemeine Java-Themen 9
J Encoding und Gewinnung von Zeichen aus der Hexa-Darstellung Allgemeine Java-Themen 6
GilbertGrape Darstellung wie in einem Diff-Programm Allgemeine Java-Themen 8
E Hexa-Darstellung Allgemeine Java-Themen 5
M Darstellung von Brüchen Allgemeine Java-Themen 3
B Darstellung von Objekten dauern unterschiedlich lang ! Allgemeine Java-Themen 5
H Unicode Darstellung in Java, spezielles Zeichen gesucht Allgemeine Java-Themen 4
D Double: Grenzen und Darstellung Allgemeine Java-Themen 7
MiMa Filtern von TableView Liste Allgemeine Java-Themen 2
B Liste aller Kombintionen mit Einschränkungen Allgemeine Java-Themen 8
TheSepp Wie kann man Leerzeichen aus einer Array liste entfernen? Allgemeine Java-Themen 10
B Liste ändern während Iteration über Diese? Allgemeine Java-Themen 16
D Erste Schritte Liste erweitern Allgemeine Java-Themen 11
sserio Variablen Liste erstellt und ein Problem mit dem Index Allgemeine Java-Themen 6
L allgemein Strings händisch in Liste sortieren Allgemeine Java-Themen 47
M einfach verkettete Liste verstehen Allgemeine Java-Themen 23
Drachenbauer wie kann ich alle instanzen einer Klasse durchsehen, ohne, dass diese in einer Liste erzeugt wurden? Allgemeine Java-Themen 11
Gaudimagspam Skip Liste erstellen in Java Allgemeine Java-Themen 3
G Java Editor Löschen doppelter Zahlen einer Liste Allgemeine Java-Themen 2
bueseb84 Spring Boot Entity mit Liste Allgemeine Java-Themen 4
MiMa Werte in liste speichern? Allgemeine Java-Themen 3
Curtis_MC Collections Liste anhand mehrere Kriterien sortieren Allgemeine Java-Themen 6
K verkettete Liste Allgemeine Java-Themen 3
G Liste (UsageStats) sortieren (Android) Allgemeine Java-Themen 5
T Google Links in einer Liste Allgemeine Java-Themen 4
looparda Liste filtern nach Prädikaten verschiedener Typen Allgemeine Java-Themen 3
OSchriever Einfach verkettete Liste ändern Allgemeine Java-Themen 43
L Liste überschreibt alte Elemte Allgemeine Java-Themen 10
H Länge einer verketteten Liste Allgemeine Java-Themen 4
E Erstellen einer Liste mit einer maximalen Menge an Elementen Allgemeine Java-Themen 13
P Element einer Liste wurde hinzugefügt, aber es gibt keinen Zugriff Allgemeine Java-Themen 2
S Methoden Liste soll Methode aus innerer Klasse aufrufen Allgemeine Java-Themen 4
L Erste Schritte Liste von Datums filter nach Monate Allgemeine Java-Themen 4
Y Liste in Stream Packen Allgemeine Java-Themen 1
K Einfache Verkettete Liste mit Node Allgemeine Java-Themen 3
perlenfischer1984 Reflection : Element in generische Liste hinzufügen Allgemeine Java-Themen 4
perlenfischer1984 Liste mit generics zurück liefern Allgemeine Java-Themen 8
S Verkettete (Teil)Liste sortieren ( rekursiv bis n) Allgemeine Java-Themen 2
G Liste zwischen zwei Kalenderdaten erstellen Allgemeine Java-Themen 3
B Wie vergleiche ich Strings in einer Liste? Allgemeine Java-Themen 5
Viktim Threads Liste In unterschiedlichen Threads bearbeiten Allgemeine Java-Themen 23
A Collections Inhalt einer Liste mit Inhalt anderer Liste vergleichen ? Allgemeine Java-Themen 7
I Abstrakte Datentypen - Liste Allgemeine Java-Themen 9
D Datentypen Klassenattribut aus Objekt in generischer Liste Allgemeine Java-Themen 15
P Liste zu Objekt umwandeln Allgemeine Java-Themen 4
Z In die Liste kann ich nichts adden Allgemeine Java-Themen 16
C Liste checken auf MINDESTENS ein Objekt | Bukkit Allgemeine Java-Themen 3
M liste von listen anders ausgeben Allgemeine Java-Themen 1
B Per Buttonklicks einer Liste Wörter hinzufügen - Wie umsetzen? Allgemeine Java-Themen 11
H Liste sortieren anhand optionalem Property Allgemeine Java-Themen 3
L Liste führt sich nicht weiter Allgemeine Java-Themen 5
A Input/Output Liste der Dateien in einem Ordner in einer Jar Datei erhalten Allgemeine Java-Themen 11
J Fragen zu generischer doppelt verketteter Liste (bei fehlendem Grundverständnis) Allgemeine Java-Themen 1
B Prüfen, ob ein Element in der Liste nicht existiert Allgemeine Java-Themen 3
B Klassen JTable mit einer Liste Allgemeine Java-Themen 0
X HTTP Auslesen der Ergebnisse von einer Webseite und in eine Liste packen Allgemeine Java-Themen 1
A Auslesen einer Datei sowie ausgeben als Liste in App Allgemeine Java-Themen 5
E Liste löscht sich selbstständig Allgemeine Java-Themen 5
H Liste von Objekten generisch sortieren Allgemeine Java-Themen 0
D Liste anhand Standardnormalverteilung befüllen Allgemeine Java-Themen 1
M Threads synchroner Zugriff (add/delete/read) auf eine Liste Allgemeine Java-Themen 6
T Datentypen Eine Liste - verschiedenen Klassen - eine Abstracte Klasse Allgemeine Java-Themen 3
M Werte aus DB in Liste speichern ohne mehrfach speicherung Allgemeine Java-Themen 18
G Liste anzahl der gleichen Objekte Allgemeine Java-Themen 6
S Pattern.Match Suche: For Schleife einbinden und in Liste schreiben Allgemeine Java-Themen 3
O aus Liste ein beliebiges Element auswählen Allgemeine Java-Themen 7
J Liste aller Com-Ports - zweistellige Ports? Allgemeine Java-Themen 15
O MVC - wo Liste der ComboBox-Items ermitteln Allgemeine Java-Themen 3
MiMa Liste von Pfaden in eine textArea schreiben Allgemeine Java-Themen 7
K kontinuierlich aktuelle Bestellsystem-Liste mit farbigem Status Allgemeine Java-Themen 2
A Auswählbare Liste Allgemeine Java-Themen 2
D Sortieren von Liste zu unperformant Allgemeine Java-Themen 6
N Liste gesucht Allgemeine Java-Themen 2
Z Sortiertes Einfügen in doppelt verkettete Liste Allgemeine Java-Themen 5
S Probleme beim Auslesen einer Liste Allgemeine Java-Themen 8
O JSON String bauen aus Liste Allgemeine Java-Themen 2
M Über Liste verschiendene JComponents mit eigenem implementierten Interface ansprechen Allgemeine Java-Themen 7
T Hashmap mit geordneter/ungeordneter liste als Value Allgemeine Java-Themen 5
D Zugriff auf Array-Liste Allgemeine Java-Themen 19
S Threads Liste mit Objekten in Teillisten zerlegen und abarbeiten Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben