Datenbank Abfragen mit großen Datenmengen

Status
Nicht offen für weitere Antworten.
S

Sauerkraut

Gast
Hallo,

ich führe in Java eine Abfrage an einer Datenbank mithilfe eines SQL Strings aus. Alleerdings kommt hat das Ergebnis mehr als eine Million Datensätze. Damit bekomme ich Probleme mit meine Java Heap Space, ich habe ihn schon versucht zu vergrößeren, trotzdem erhalte ich eine Exception das der Speicher zu klein ist.

java.lang.OutOfMemoryError: Java heap space

Wie muss man in Java mit solchen Datenmengen umgehen?
 
G

Gelöschtes Mitglied 5909

Gast
da musst du wohl auf die hdd streamen
 
M

maki

Gast
... oder genauere und daher bessere Abfragen formulieren, es ist eher selten, das man wirklich so viele Datensätze benötigt.
 

HeRaider

Aktives Mitglied
Ist doch logisch, dass es da Probleme gibt. Ich würde mal grob schätzen, dass das mit dem restlichen Programm locker mal 500-1000MB sind die dann im Arbeitsspeicher landen müssten. Daher also wie raiL schon gemeint hat ab auf die Festplatte damit und dann einfach Datensatz für Datensatz aus der Datei lesen und verarbeiten.
 
G

Guest

Gast
Ok... nur kurz zur Info...

Ich weiß das es im ersten Moment nicht sinnig ist, aber trotzdem muss es theoretisch gehen. Ich hab einfach soviele Daten in meiner Datenbank und die möchte ich unter bestimmten Umständen auch alle anzeigen lassen. Warum ist mal dahin gestellt, aber die ganze Admin GUI Tools kriegen das auch hin.
 

ms

Top Contributor
Ich kenne kein Tool das 1Mio Datensätze auf einmal darstellt. Höchstens über eine Blätterlogik 20, 30, 50, 100 ... Datensätze pro Seite anzeigt.

ms
 

Mork

Mitglied
Ich weiß das es im ersten Moment nicht sinnig ist, aber trotzdem muss es theoretisch gehen. Ich hab einfach soviele Daten in meiner Datenbank und die möchte ich unter bestimmten Umständen auch alle anzeigen lassen.
Kannst du die Datensätze nicht nacheinander holen? 1Mio Datensätze kann man eh nicht gleichzeitg anschauen, auch nicht mehr einem Admin GUI Programm.
 
S

Sauerkraut

Gast
Ich verwende als Datenbank Postgre und den dazu gehörigen pgAdmni Query... mit dem kann ich tatsächlich weit mehr als eine Millionen Datensätze abfragen und auch anzeigen lassen. Und das auch ziemlich flott, ohne blättern oder warten.

Im Speicher werden dafür nicht mehr als 150MB verwendet.

Und das richtig Tolle ist, man kann es auch von dort exportieren.

Warum sollte man das über eine Java Applikation nicht auch hinbekommen?
 

Jockel

Top Contributor
Das möchte ich sehen, dass 1 Million Datensätze GLEICHZEITIG auf dem Bildschirm dargestellt werden. Alles andere lässt sich durch nachladen der Daten bewerkstelligen.
 
S

Sauerkraut

Gast
Zumindest nicht gleichzeitig auf dem Bildschirm, aber man kann ganz bequem runterscrollen und das beliebig schnell und das in der Zwischenzeit nachgeladen wird. Die Abfrage dauert ca. 3 Minuten, danach kann man ganz bequem mit den Daten arbeiten.
 

Mork

Mitglied
Glaube trotzdem nicht, dass die Daten dann komplett im Hauptspeicher liegen. Viel eher werden dann Hashtabellen oder sonstige Indexstrukturen erstellt, dass es beim Scrollen so aussieht, als ob nicht nachgeladen wird.
 
G

Guest

Gast
Ok... wie kann man sowas dann in Java bewirken, mehr will ich doch gar nciht wissen....
 
M

maki

Gast
Zumindest nicht gleichzeitig auf dem Bildschirm, aber man kann ganz bequem runterscrollen und das beliebig schnell und das in der Zwischenzeit nachgeladen wird.
Offensichtlich werden nicht 1 Mio Datensätze gleichzeitig geladen (wäre auch ziemlich bescheuert wenn es um die Anzeige am Bildschirm geht).

Das kannst du doch nachbauen.
 

Mork

Mitglied
Du kannst das Ergebnis ja limitieren. Dann holst dir die Datensätze 1 bis 10 der Anfrage, dann 11 bis 20 usw. In MySQL nennt sich die Funktion limit.
 
G

Guest

Gast
Also von der Performance kann ich es nur noch mal wiederholen, dass das Tool einmal die Abfrage startet (dauert ca. 3 min) und man danach wunderbar durch die Datensätze scrollen kann, ohne das er was nachladen muss. Man kann das auch wunderbar an der Rechenauslastung überprüfen. Das heißt er muss irgendwo die Daten zwischengelagert haben und schnell abrufen können.
 

sparrow

Top Contributor
Die Datenbank kann sie doch auch vorhalten....
Wie genau rufst du denn das ResulSet ab? Einfach einmal komplett durch und irgendwo in eine Collection geschrieben? Das ist vielleicht nicht die beste Idee.

Ich habe mit PostgreSQL folgende Erfahrungen gemacht:
Auch sehr große Datenmengen lassen sich problemlos abarbeiten.
Deine Abfrage landet doch eh nicht auf einmal bei dir, sondern nur das wo der Zeiger auf den Datensätzen steht.
Ich nehme an du hast eine Order oder Group-Klausel in deiner Abfrage.

Wie gesagt, Limit ist prima zum eingrenzen der Datensätze, ansonsten kannst du dir auch überlegen ob du das ResulSet solange offen lässt und mit dem Zeiger nach und anch durch die Datensätze wanderst. Das ist allerdings nicht besonders schön.
 

happy_robot

Bekanntes Mitglied
das grösste problem scheint mir hier die suche eines passenden bildschirms zu sein welcher 1Mio-datensätze tatsächlich gleichzeitig darstellen kann... :)

ansonsten ist das "abholen" dieser anzahl datensätze auf einen rutsch wohl nichts anderes als ein denkfehler, die unkenntnis der möglichkeiten der replikation, oder einfach mangelnde SQL-Kenntnisse.
 
S

Sauerkraut

Gast
Es geht mir nicht darum sie gleichtzeitig darzustellen, sondern nur um das Prinzip damit zu arbeiten, ohne das man es nachladen muss.

@Happy Robot: Bevor du große Reden schwingst und Begriffe in die Welt setzt, solltest du lieber Lösunvorschläge bringen oder einfach ruhig sein.
 

DP

Top Contributor
happy_robot hat gesagt.:
die unkenntnis der möglichkeiten der replikation, oder einfach mangelnde SQL-Kenntnisse.

was hat denn das eine mit dem anderen zu tun?! replikation ist hier völlig irrelevant
 

ARadauer

Top Contributor
ich hatte mal ein Tutorial, wo sowas beschrieben wird. Ich muss zuhause nachschaun, ich poste am Abend den link.

Es ging ungefähr so... Es werden ca 100 Zeilen geladen, wird bis zur Zeile 80 gescrollt, werden die nächsten 100 geladen, damit das schön flüssig ist. Die Werte werden in ein einer Arraylist gehalten. Sind mehr als 500 Zeilen geladen, werden alte Zeilen verworfen...

Man mus sich ja nur das JTableModel ansehen, was braucht man? Die Anzahl der Zeilen, die kann man sich über ein count oder sonst was hohlen. Und dann eine Möglichkeit bestimmte Zeilen zurück zugeben und diese und +- 50 andere lädt man wenn sie nicht vorhanden ist.

Wie gesagt, ich werde das Tutorial am Abend posten. Ausser ich betrink mich heute total, dann mach ichs morgen..... ;-)
 

robertpic71

Bekanntes Mitglied
Da gibt es ein Reihe von Möglichkeiten:

1.) ResultSet Type ändern
Teste einmal
Code:
stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,
java.sql.ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(Integer.MIN_VALUE);
Per Default wird das ResultSet komplett gepuffert. Diese Einstellungen sollten dem JDBC-Treiber signalisieren, dass das nicht macht. Sollte normalerweise auch bei PostgreSQL funktionieren.

2a. Mit LIMIT und OFFSET arbeiten
Code:
SELECT * FROM table LIMIT 10000 OFFSET 20000
Damit kann man sich die Tabelle in kleineren Scheiben holen.

LIMIT = Anzahl der zu lesenden Sätze
OFFSET = Anzahl der zu überlesenden Sätze

Also z.B.
.. LIMIT 10000 OFFSET 0
.. LIMIT 10000 OFFSET 10000
.. LIMIT 10000 OFFSET 20000
...

Die LIMIT und OFFSET sind aber keine Standard-SQL-Befehle. PostgreSQL kann sie, aber andere Datenbanken ev. nicht.

Variante a.)
Die GUI-Komponente mit allen Sätzen "vollknallen".

Variante b.)
Das Scrollevents abfragen und immer hinten Sätze dazulesen. Hier wäre ein kleineres Limit z.B. 50-500 sinnvoll.

Variante c.)
Die Daten in einen serializierbare Form bringen (z.B. ArrayList, RowSet oder CachedRowSet) und die GUI von dort bedienen.

3.) Mit Stored Procedures arbeiten
Hier wird der Cache auf der Serverseite angelegt. Die Definitionen der stored Procdures
gehen bei den Datenbanken ziemlich auseinander. Da kann ich (für PostgreSQL) nicht mit einem Beispiel dienen.

/Robert
 
S

Sauerkraut

Gast
Danke für die Übersicht der Möglichkeiten. Damit kann ich was anfangen.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
P Klassen Template-Klasse für Datenbank-Abfragen erstellen Allgemeine Java-Themen 2
8u3631984 Bilder in Datenbank speichern - sinnvoll Allgemeine Java-Themen 5
S Kochbuch bzw. Rezepte-Datenbank app mit Swing..? Allgemeine Java-Themen 5
N relativier Pfad für sqlite-Datenbank in Gradle/IntelliJ Allgemeine Java-Themen 2
Avalon Data Transfer Objekte aus Datenbank erstellen Allgemeine Java-Themen 8
B API Token in Datenbank ablegen? Allgemeine Java-Themen 9
S Einzigartigen String in Datenbank finden und löschen Allgemeine Java-Themen 23
P Datenbank-MiniGUI fügt keine Daten ein Allgemeine Java-Themen 4
Q-bert Strings aus der JList in eine Datenbank speichern Allgemeine Java-Themen 1
Meeresgott Kapselung Tabellen der Datenbank erzeugen. Allgemeine Java-Themen 7
D Daten in MySQL-Datenbank schreiben Allgemeine Java-Themen 13
looparda Unit Test - Abgänigkeit zur Datenbank isolieren Allgemeine Java-Themen 3
T Datentypen MNIST Datenbank auslesen (.gz) Allgemeine Java-Themen 0
O 2 Combobox in Abhängigkeit von der 1 Combobox (Datenbank) Allgemeine Java-Themen 1
L Daten ohne Datenbank richtig abspeichern Allgemeine Java-Themen 5
M Objekt serialisieren/deserialisieren und in einer SQLite-Datenbank speichern Allgemeine Java-Themen 3
F OOP Datenbank-Klasse überall verfübar Allgemeine Java-Themen 2
R Test Umgebung für Datenbank erstellen, was braucht es? Allgemeine Java-Themen 14
D OOP Design Pattern für GUI - Datenbank Anwendung Allgemeine Java-Themen 1
T Zugriff auf Datenbank Allgemeine Java-Themen 1
G Datenbank von nöten? Allgemeine Java-Themen 7
3 Backup von h2-Datenbank-Datei erstellen Allgemeine Java-Themen 6
S Java DateTime für Datenbank Allgemeine Java-Themen 4
F Alternative sun.jdbc.odbc.JdbcOdbcDriver (Access Datenbank) Allgemeine Java-Themen 2
vandread Daten verschlüsseln mit Java oder Datenbank Allgemeine Java-Themen 15
P MYSQL Datenbank Dump einspielen Allgemeine Java-Themen 1
M SQL Datenbank in JAVA Projekt Allgemeine Java-Themen 3
P iTunes Datenbank manipulieren Allgemeine Java-Themen 2
A Ausführbare Java-Datei aus Projekt und Datenbank Allgemeine Java-Themen 3
T Datenbank oder Filesystem? (E-Learning) Allgemeine Java-Themen 2
N Datei aus Datenbank öffnen mit Standardanwendung Allgemeine Java-Themen 2
J Datenbank und OO-Aufsatz Allgemeine Java-Themen 9
M BufferedReader: Vom Logfile zur Datenbank Allgemeine Java-Themen 6
E JAVA Alternativen zur Datenbank? Allgemeine Java-Themen 7
Dit_ GeoKoordinaten Datenbank (nicht nur Städte) Allgemeine Java-Themen 6
J Progress Bar während Datenbank Erstellung Allgemeine Java-Themen 2
C Datenbank - Textfiles - Anderes Allgemeine Java-Themen 34
T Datenbank lässt sich un Entwicklungsumgebung öffnen, aus .jar aber nicht Allgemeine Java-Themen 9
G JNDI/LDAP/Datenbank Allgemeine Java-Themen 2
Meldanor Speichern der Datenbank - Lohnen sich mehrere Threads? Allgemeine Java-Themen 2
hdi [Free Download] Film-Datenbank Allgemeine Java-Themen 30
G Excel-Daten in Datenbank speichern - Problem mit leeren Feldern Allgemeine Java-Themen 7
K von List getSelected auf ResultSet Datenbank löschen Allgemeine Java-Themen 2
C Java Polling, Server Prozedur oder doch Datenbank? Allgemeine Java-Themen 4
H .dbf (IV) Datenbank einlesen Allgemeine Java-Themen 9
D Recipes / Codeschnipsel Datenbank für Java? Allgemeine Java-Themen 3
T MySQl Datenbank als Array ausgeben Allgemeine Java-Themen 11
M Rechenweg in Datenbank speichern und nutzen Allgemeine Java-Themen 6
O viele Datensätze aus Datenbank - Java Heap Space - Excepion Allgemeine Java-Themen 25
E Datenbank/iBatis Fehlermeldung Allgemeine Java-Themen 4
G Datenbank zur laufzeit wechseln Allgemeine Java-Themen 11
N ClassLoader - Laden von Bytecode aus einer Datenbank Allgemeine Java-Themen 6
S Speicherung von Daten: Datenbank(sql) oder xml? Allgemeine Java-Themen 9
F Vector in eine Datenbank speichern? Allgemeine Java-Themen 3
A Problem beim Starten der H2-Datenbank Allgemeine Java-Themen 4
G Datenbank-Anwendung schnell erstellen. Allgemeine Java-Themen 7
P Datenbank Tabelle spiegeln Allgemeine Java-Themen 22
E MySQL-Datenbank <-> HashMap/TreeMap Allgemeine Java-Themen 1
P Zugriff auf die DatenBank Allgemeine Java-Themen 44
H Daten aus MySQL datenbank auslesen und in ArrayList stecken Allgemeine Java-Themen 8
P Timestamp in eine Firebird-Datenbank einfügen Allgemeine Java-Themen 6
P Java Acces Datenbank Problem ! (Brauche eine Abfrage) Allgemeine Java-Themen 5
B Datenbank anlegen Allgemeine Java-Themen 10
N Datenbank vs. Filesystem Allgemeine Java-Themen 5
F datenbank oder csv etc Allgemeine Java-Themen 6
V Brauche Beratung in Sachen Java+Datenbank+Web Allgemeine Java-Themen 8
G Ab wann Datenbank verwenden Allgemeine Java-Themen 15
H sichere Datenbank-Verbindung Allgemeine Java-Themen 4
H Datenbank an ein Java Client Server Programm anschliessen Allgemeine Java-Themen 3
F lizenzfreie Datenbank für JAVA-Anwendung Allgemeine Java-Themen 3
S Zeilenausgabe Datenbank Allgemeine Java-Themen 2
S Datenbank Allgemeine Java-Themen 9
G Sichere Passwortübergabe bei Datenbank Allgemeine Java-Themen 14
L Datenbank Abfrage (Felder&Tabelle nicht fix) in ArrayLis Allgemeine Java-Themen 4
S Java Datenbank auf Festplatte installieren Allgemeine Java-Themen 2
G JComboBox mit Werten aus einer Access Datenbank füllen Allgemeine Java-Themen 18
T Java Application Server + Datenbank von CD Allgemeine Java-Themen 8
G Abfrage in datenbank Allgemeine Java-Themen 5
G Daten aus MySQL-Datenbank an JFreeChart übergeben Allgemeine Java-Themen 3
D Userdaten + Datenbank? Allgemeine Java-Themen 11
G HSQLDB Datenbank-Dateien aus Jar-Datei lesen Allgemeine Java-Themen 5
ReinerCoder Case statt if else Abfragen?! Allgemeine Java-Themen 8
O Datentypen Wie kann ich den Typ einer ArrayList abfragen ? Allgemeine Java-Themen 7
VfL_Freak KeyEvent.VK_TAB im KeyListener abfragen Allgemeine Java-Themen 13
cool_brivk24 Variablen abfragen von Boolean von anderer Klasse Allgemeine Java-Themen 12
B Generelle Frage bei einer Webanwendung / Reduzierung von DB Abfragen Allgemeine Java-Themen 1
E Status eines USB Mikrofon abfragen Allgemeine Java-Themen 2
D TextBox Abfragen Allgemeine Java-Themen 2
kodela aktuelle Position des Hauptfensters abfragen Allgemeine Java-Themen 12
J Tonhöhe & Lautstärke abfragen? Allgemeine Java-Themen 3
K USB infos unter Linux abfragen? Allgemeine Java-Themen 2
P Threads Parallelisierte DB-Abfragen mit variabler Anzahl an Threads Allgemeine Java-Themen 4
MiMa Variableninhalte dynamisch abfragen Allgemeine Java-Themen 12
A Erste Schritte If Abfragen + Scanner Allgemeine Java-Themen 7
Z AD Abfragen mit Java! Allgemeine Java-Themen 3
L Abfragen ob Threads fertig Allgemeine Java-Themen 3
chuxXo BasicPlayer - Beendigung Abfragen (Allgemein) Allgemeine Java-Themen 21
P Name der Parent Klasse abfragen Allgemeine Java-Themen 8
H In windowClosing() abfragen, ob STRG gedrückt wurde Allgemeine Java-Themen 8
M Aktuelle Systemzeit und Datum abfragen Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben