Vector OutOfMemoryError?

Sebastian29

Erfahrenes Mitglied
Hi an alle!

Folgendes Datenverkehr:

Client --> Server ---> Datenbank

Der Client holt pro Serveranfrage 1000 Datensätze und es sind insgesamt 100.000 Datensätze, d.h. es wird 10 mal an den Server angefragt! So, alle 1000 Datensätze füge ich immer ins Vector rein. Beim Einfügen ins Vector knallt plötzlich schon bei 44.000 Datensätze ein OutOfMemoryError. Mit dem vollständigen gefüllten Vector gebe ich der JTable mit Model weiter, um diese Datensätze in der Tabelle darzustellen!

Wie kann ich das Ganze am besten dynamisch darstellen?

Ich habe mir ja überlegt, dass ich das Vector-Objekt pro Serveranfrage (1000 Datensätze) serialisieren könnte und man kann ja bei JTable mit Model dynamisch darstellen, z.B. pro Tabelle darf man nur 1000 Datensätze darstellen, je nach dem, was man auch die Anzahl der Datensätze eingeben kann und mit 2 Buttons die Tabellen hin und her wechseln!
Genauso wie hier


Danke im voraus!

Gruß
Sebastian29
 
Definieren Datensatz. Wenn ein Datensatz 10kB groß ist, bist du bei 100000 Datensätzen bei knapp einem Gigabyte Speicher den du benötigst. Die Frage ist also: liest du wirklich nur die Daten die du für die Anzeige benötigst? Auf der anderen Seite macht IMHO in Bezug auf die Benutzbarkeit auch eine Tabelle mit 1000 Einträgen keinen Sinn. Kannst du die Anzahl der anzuzeigenden Elemente nicht vorher irgendwie einschränken? Criteria?

Gruß
Ollie
 
Also, ich bekomme vom Server byteweise ein Paket mit der Größe 250 bytes pro Datensatz , d.h. bei 1000 Datensätze = 250.000 bytes => 250 kb und bei 100.000 Datensätze => 25.000 kb => 25 MB!

Also, es geht ja um eine Suchmaschine, mit der ich nach Ort und Name suchen kann! Und wenn ich bei Ort ein * und bei Name nichts eintrage, dann bedeutet das auch, dass der Anwender alle Datensätze kriegt! Das Suchen mit Filter ist auch mitdrin, um zuviele Datensätze zu vermeiden. Nur mein Chef will das so haben. ;-)

Nein, ich kann nicht vorher irgendwie einschränken

Gruß
Sebastian29
 
Hallo,

mal so eine spontane Idee von mir wäre, dass du halt nicht alle Datensätze anzeigst, sondern ähnlich google die ersten 10 und man dann halt, wenn man möchte, die nächsten 10 Datensätze anzeigen kann.
Alle anderen Datensätze die dann noch nicht angezeigt werden, könntest du so lange auf der Festplatte cachen, damit du nicht alle Datensätze im Speicher hast.


MFG

Sascha
 
Okay, sowas hatte ich "befürchtet". ;) Dann macht Blättern natürlich Sinn. Allerdings sind 1000 pro Seite etwas groß für meinen Geschmack.

Wenn du allerdings bei eigentlich nur 25MB Daten eine OutOfMemory bekommst, ist vermutlich was in deinem Code im Argen. Machst du alle Resource wieder richtig zu? Legst du unnötig Objekte an? Irgendwo hast du vermutlich ein MemoryLeak.

Gruß
Ollie
 
@Sascha
Was meinst du genau mit "...Festplatte cachen..."? Aber genau das habe ich auch vor, dass alle Datensätze irgendwo in der Festplatte gespeichert werden soll und ich habe auch natürlich vor, dass die großen Daten nicht in eine Datei gepackt werden soll. Das würde beim Auslesen zu lange dauern, um in der Tabelle darzustellen, deshalb frage ich auch, was du mit dem Cachen genau meinst!
Es würde doch nicht bedeuten, dass z.B. bei 100.000 Datensätze jeweils 1000 Stück in eine Datei packen, oder? Sowas würde insgesamt 10 Dateien stehen und beim Blättern diese Dateien hin und her laden und in der Tabelle darstellen!

DateiForPage1.dat <--- Vector-Objekt (1000 Stück) speichern
DateiForPage2.dat <--- Vector-Objekt (1000 Stück) speichern
DateiForPage3.dat <--- Vector-Objekt (1000 Stück) speichern
... usw.!

@Oliver
Also, 1000 pro Seite finde ich nicht so schlimm! Aber du meinst bestimmt, 1000 aus der Datei zu laden, wäre keine gute Idee oder? ;)

Zu MemoryLeak habe ich auch "befürchtet"! In meinem Programm sind sehr viele JFrame-Fenster mit allen verschiedene Komponenten wie JButton, JTextField, JLabel, usw.! Diese grafische Oberflächen sind natürlich auch fast große "Speicherfresser"! Ja, ich mache alle Ressourcen zu. Bei JavaSE 1.4.2 ist es natürlich schwierig, den MemoryLeak mit einem speziellen Monitoring zu finden oder gibt es doch sowas für diese Version?
Beim Öffnen des JFrame-Fensters initialisiere ich immer für allen Komponenten mit NULL, aber muss ich das alles auch beim Schliessen auf NULL setzen, um die unnötigen Referenz-Objekte aufräumen zu lassen?

Gruß
Sebastian29
 
Ich fänd als Benutzer 1000 Einträge pro Tabelle recht viel. Ich mein, schut sich der Benutzer wirklich 1000 Einträge an? Auch 100 sind schon arg. Seitengrößen über 50 sind eigentlich kaum sinnvoll (von Benutzersicht aus).

Bzgl. des Memoryleaks vermute ich eher, das beim Öffnen und SChließen der Ressourcen (dein "DBZugriff"). GUI Elemente zum Speicherfresser werden zu lassen, ist schon schwierig. Wenn du noch ein bischen Zugriffscode hast, könnte man da ja mal draufschauen.

Gruß
Ollie
 
Ich muss Olli recht geben. Ich denke, dass ein User sich nichtmal 50 Einträge anschaut. Das sind zuviele Informationen auf einmal. Ich würde maximal 20 Einträge auf einmal anzeigen.

Mit "cachen" meinte ich, dass du die Einträge wie auch immer auf der Festplatte ablegst. Ich würde aber nur die auf der Platte ablegen, die gesucht wurden. Also nicht alle auf einmal. Wenn dann nochmal gesucht wird, würde ich erstmal in den gecachten Datensätzen nachschauen, ob da schon welche sind. Diese braucht man dann nicht nochmal "runter zu laden".
Wie diese Cache letztendlich realisiert wird liegt an dir. Du kannst auch alles halt in eine Datei speichern.

Zu dem Memoryleak. Es passiert oft, dass es in mehreren Listen Referenzen zu einem Object gibt. Oft wird dann vergessen, solche Referenzen aus allen Listen zu entfernen. So bleibt das Object dann ständig im Speicher, obwohl man es nicht mehr braucht.

MFG

Sascha
 
Zurück