outOfMemoryError beim Einlesen einer Datei abfangen?

Status
Nicht offen für weitere Antworten.

gorgophol

Mitglied
Hallo,

ich hab folgendes Problem. Ich musste beruflich eine Klasse schreiben, die folgendes tut:

1. Datei einlesen: die besteht aus x Zeilen mit jeweils einer Zuordnung --> Attribut=Wert
2. Speichern dieser Zuweisungen in einer Hashtable
3. werden zwei Strings übergeben (Attribut + Wert). Ist das Attribut vorhanden, soll der Wert zurückgeliefert werden, ansonsten die Hashtable und damit die Datei um diese Zuordnung erweitert werden.

Ok. soweit einfach. Ich les das ein und schreib die Daten entweder in einen Stringbuffer, den ich am Ende wieder in die Datei schreiben kann, oder nur in die Hashtable, die ich am Ende über ne Schleife in die DAtei schreiben kann.

Um das mit größeren Dateien testen zu können, hab ich mir eine Klasse geschrieben, die bis zu einem Maximalwert einfach Zuordnungen in einen Stringbuffer und den in eine Datei schreiben sollte. Da bekam ich den ersten outOfMemoryError bei knapp 215000 Zeilen. Das hab ich gelöst indem ich alle 200000 Zeilen, den Stringbuffer speicher und neu erzeuge. Also macht die Dateierzeugung keine probleme, außer man hätte keinen Plattenplatz mehr.

Logischerweise krieg ich ja aber die gleichen Speicherprobleme, wenn ich die Datei ja mit der ursprünglichen Klasse dann einlesen und weiter verarbeiten muss. Und da wüsste ich nicht, wie ich regelmäßig das alles zwischenspeichern sollte.

Hab schon mit Xms und Xmx versucht mehr Speicher zur Verfüguing zu stellen, bis meinem 1 GB Arbeitsspeicher, aber das hatte überhaupt keine Auswirkungen.

Hat noch jemand eine Idee?
 
B

Beni

Gast
Hm, soviel ich weiss, arbeiten Hashtable (und ganz sicher StringBuffer) mit Arrays. Wenn man aber z.B. einen 100MB-Array benötigt, muss dieser Speicher am Stück frei im RAM sein. Das passiert praktisch nie...
Nur mal aus Neugier: was passiert, wenn du anstelle einer Hashtable eine Datenstruktur wie die "java.util.TreeMap" (die ohne Arrays auskommt) verwendest?

Vielleicht würde sich für dieses Problem auch die Verwendung einer Datenbank lohnen. Dann must du dir keine Sorgen mehr wegen Speichermangel machen.
 

gorgophol

Mitglied
Das mit der anderen Speicherstruktur werd ich nächste Woche mal ausprobieren. Vielleicht wäre das ne Lösung. Direkt einfach irgendwie Speicher bereitstellen, der ja vorhanden wäre, kann man wohl nicht, oder?

Was die Datenbank angeht, die Zuordnungen, die in der Datei drinstehen, kommen ja letztendlich aus ner Datenbank. Mittels dieser DAtei will mein Kollege die jeweils korrekten Zuordnugnen in verschiedenen Systemen synchron halten. Naja. Das war jetzt schlecht erklärt, aber besser geht das auf die Schnelle net :)

Ich könnte vielleicht noch erwähnen, dass das eher ein Problem ist, weil ich ein bisschen Perfektionist bin in der Hinsicht und gerne hätte, dass meine Programme auch später noch verwendet werden können, wenn mal mehr Daten woanders anfallen sollten. Für den konkreten Fall werdens nie mehr als 10 - 20000 Zeilen...

Wobei meine Dateien immerhin schon 500.000.000 Zeilen aufweisen konnten, bei knapp 14 GB Größe :)
 
B

Beni

Gast
14 GB? Wow, damit arbeitest du in Bereichen die ich nur in der Theorie kenne...

Was ich aber sagen kann: du hast niemals genügend RAM für den Spass (zumindest nicht in naher Zukunft).
Darum möchte ich noch die Datenstruktur B-Tree einwerfen. Ein B-Tree ist so aufgebaut, dass man einen Teil auf der Festplatte einlagern kann. Nur der Teil mit dem man arbeitet, muss geladen werden.
Dein Programm hat doch hoffentlich keine Echtzeitanforderungen... ?
 

Bleiglanz

Gesperrter Benutzer
kannst du die datei nicht als property datei behandeln??

und falls nicht:

warum liest du alles in eine Hashtable ein, ist doch unsinn

iteriere durch die zeilen
wenn wert vorhanden für key => return diesen wert

wenn beim iterieren kein wert gefunden
mit append direkt ans File hinten anfügen

es gibt doch überhaupt keine veranlassung, den ges. dateiinhalt in den speicher einzulesen?
 

gorgophol

Mitglied
Also die 14 GB-Datei werd ich wohl auch nie benutzen. Das war mehr so zum Testen ob meine Dateierzeugungsprogramm irgendwelche weiteren Grenzen erreicht. Hat es nicht :) Außer die Grenzen der Festplatte eben ... Dass da der Speicher net reicht ist mir ja schon klar :) Aber mehr als 200000 Zeilen sollten halt drin sein, dachte ich. Aber ich guck mir auch B-Tree mal an. Danke :) Und nein, keine Echtzeitanforderung. Allein die Datei zu erstellen dauert gute 45 Minuten, bei der Größe :) Windows kann sie übrigens auch net mehr öffnen *g*

Also die Klasse, mit der ich das File einlese ist ne Erweiterung der Klasse Properties (oder Property?) die von Java ja mitkommt. Ich hab die erweitert, um eben genau auch Daten aus Files verarbeiten zu können, die man net als Property-Datei liefert.

Als Hashtable deshalb, weil ich dachte, dass ein Hashtable genau dafür da ist, schnell eine Zuordnung von Key und Wert überprüfen zu können. Ich will ja nicht immer durch die ganze Datei iterieren müssen. Grad wenn ich doch so riesige Dateien (zumindest theoretischt) verarbeiten können möchte. Zeilenweises Einlesen und Verarbeiten kam mir auch nie in den Sinn, weil ich gelernt hab, dass man für solche Fälle Stringbuffer und Hashtables benutzt :)
 

Bleiglanz

Gesperrter Benutzer
200000 Properties?

und du willst die immer wieder abfragen und nicht jedesmal durchiterieren?

(ich dachte du bräuchtest nur gelegentlich einen wert)

verwende lieber eine Datenbank und mach deinen key zum primärschlüssel einer einfachen tabelle, sollte noch relativ schnell sein :)
 

gorgophol

Mitglied
Nein. Es werden an Ende ca 20000 Zuordnugnen in der Datei stehen. In dem speziellen Fall.
Soweit kommt ja ne Hashtable noch super mit :)

Meine idee war eben, dass man das Prinzip irgendwie auch auf größere Datenmengen anwenden könnte. Weils eben so recht bequem ist und schneller, als immer durch die Datei zu iterieren.

Dass es beim reinen Iterieren keine Probleme geben sollte, ist mir klar, aber ich wollte das ja eben gerade verhindern :) Daher dieser Ansatz
 

Bleiglanz

Gesperrter Benutzer
gorgophol hat gesagt.:
Meine idee war eben, dass man das Prinzip irgendwie auch auf größere Datenmengen anwenden könnte.

ist IMHO eine schlechte Idee

warum riesige Mengen Hauptspeicher für eine Lookup-Tabelle verbraten, nur weil man ab und zu einen Wert braucht?

oder ist das ein performance-problem und du musst in jeder sekunde ein paar hundert keys nachschlagen (ist natürlich was anderes)

Hashtable und sowas ist normalerweise einfach für "kleinere" Datenbestände reserviert, ab 10000 Zeilen ist eine (embedded) Datenbank wahrscheinlich besser
 

gorgophol

Mitglied
Bleiglanz hat gesagt.:
ist IMHO eine schlechte Idee

warum riesige Mengen Hauptspeicher für eine Lookup-Tabelle verbraten, nur weil man ab und zu einen Wert braucht?
Das seh ich jetzt auhc ;-)
oder ist das ein performance-problem und du musst in jeder sekunde ein paar hundert keys nachschlagen (ist natürlich was anderes)

Naja. Früher oder später wirds ein Performanceproblem denk ich. Weil wenn man jetzt ganz bequem über eine Methode diesen Abgleich und die Erweiterung durchführen kann, ist es ja nur ne Frage der Zeit, bis jemand auf die Idee kommt, das ganze net mehr sporadisch per Hand aufzurufen, sondern automatisch über ne Schleife oder was auch immer. Ich will halt drauf vorbereitet sein und net dann erst merken, dass meine Klasse das net kann ...

Dass das per Hashtable wohl net geht ist relativ klar jetzt :) Aber das war halt die Anforderung. Man will da ja keine extra Datenbank für verwenden, sondern explizit das über ne Datei steuern.
 

messi

Bekanntes Mitglied
gorgophol hat gesagt.:
Man will da ja keine extra Datenbank für verwenden, sondern explizit das über ne Datei steuern.
Falls du es dir doch noch mit der Datenbank überlegst, schau dir mal die Portierung der Berkeley DB in pures Java an. Gibt es auch von Sleepycat.
 

gorgophol

Mitglied
Also die TreeMap scheitert noch vor der Hashtable.

Wie find ich den was über B-Tree? Hab ich noch nie von gehört
 

messi

Bekanntes Mitglied
gorgophol hat gesagt.:
Also die TreeMap scheitert noch vor der Hashtable.
Was heißt "scheitert"?

gorgophol hat gesagt.:
Wie find ich den was über B-Tree? Hab ich noch nie von gehört
B-Baum-Varianten werden von fast allen Dateisystemen und Datenbanken benutzt. Ich kenne jetzt keine konkrete Java-Klasse, die dir die Möglichkeit bietet, die Daten teilweise auf die Platte auszulagern. Aber letztlich wäre das dann wieder nichts anderes als eine Datenbank.
Schau dir einfach mal die Berkeley DB an. Das ist eine schnelle Schlüssel-Wert-DB. Kein SQL erforderlich. http://www.sleepycat.com/products/je.shtml
 

gorgophol

Mitglied
Scheitert heißt selber outOfMemoryError, nur etwas früher als bei Verwendung der Hashtable.

Also keine dramatischen Unterschiede. Vielleicht war die Klasse auch net mehr ganz identisch mit meiner Messung bei der Hashtable damals. Auf jeden Fall keine nennenswerte Verschiebung des Problems nach hinten.

Ich kann aber halt net einfach ne DB in die Firma schleppen und das ausprobieren :) Ich könnte höchstens was verwenden, was wir eh haben. Aber das war wie gesagt nicht gewollt ...
Zumindest hab ich jetzt die Grenzen von Java mal erreicht in der HInsicht :)

Trotzdem danke für eure Anregungen :) Vielleicht kann ich sie mal umsetzen, wenn die Aufgabenstellung entsprechend ist
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
P OutOfMemoryError beim XML erstellen bzw parsen, mehr RAM? Allgemeine Java-Themen 4
H Apache fop - OutOfMemoryError Allgemeine Java-Themen 10
L Java OutOfMemoryError Java heap space Allgemeine Java-Themen 3
B OutOfMemoryError kommt nicht/Bug in Java? Allgemeine Java-Themen 2
Maxim6394 OutOfMemoryError nicht nachvollziehbar Allgemeine Java-Themen 8
reibi OutOfMemoryError bei Behandlung von BufferedImage's Allgemeine Java-Themen 6
E OutOfMemoryError bei Verschlüsselungsalgorithmus Allgemeine Java-Themen 3
L java.lang.OutOfMemoryError: Java heap space Allgemeine Java-Themen 10
H java.lang.OutOfMemoryError bei der wiederholten Erzeugng von Threads Allgemeine Java-Themen 8
D OutOfMemoryError:Java hep space Allgemeine Java-Themen 7
M OutOfMemoryError in nebenläufigen Threads Allgemeine Java-Themen 6
C nach ca. 1 Stunde OutOfMemoryError Allgemeine Java-Themen 15
Shoox OutOfMemoryError Allgemeine Java-Themen 10
J Crawler selbst geschreiben: OutOfMemoryError Allgemeine Java-Themen 14
A OutOfMemoryError: Java heap space Allgemeine Java-Themen 11
K OutOfMemoryError: Java heap space troz -Xms1024m Allgemeine Java-Themen 2
R OutofMemoryError bei CharArraywriter Allgemeine Java-Themen 5
F OutOfMemoryError: Java heap space - Speicher verändern Allgemeine Java-Themen 8
J java Thread java.lang.OutOfMemoryError: Java heap space Allgemeine Java-Themen 7
B OutOfMemoryError und Arraylisten Allgemeine Java-Themen 2
G Error: java.lang.OutOfMemoryError: Java heap space Allgemeine Java-Themen 2
S java.lang.OutOfMemoryError: Java Allgemeine Java-Themen 22
M java.lang.OutOfMemoryError Allgemeine Java-Themen 2
F java.lang.OutOfMemoryError: Java heap space Allgemeine Java-Themen 22
S fehlermeldung java.lang.OutOfMemoryError Allgemeine Java-Themen 5
H Skalieren von Image -> java.lang.OutOfMemoryError - WARUM Allgemeine Java-Themen 18
G jTable-Problem --> java.lang.OutOfMemoryError Allgemeine Java-Themen 5
F java.lang.OutOfMemoryError Allgemeine Java-Themen 13
C OutOfMemoryError lokalisieren Allgemeine Java-Themen 9
M java.lang.OutOfMemoryError Allgemeine Java-Themen 7
T jva.lang.OutOfMemoryError Allgemeine Java-Themen 8
F java.lang.OutOfMemoryError Allgemeine Java-Themen 17
berserkerdq2 Weiß jemand wie ich im Scenebuilder das Fenster so darstellen kann, dass beim Vollbildmodus die Objekte so angezeigt werden? Allgemeine Java-Themen 1
C Probleme beim Erstellen eines runnable-jar files Allgemeine Java-Themen 1
B Mysteriöse Ergebnisse beim Baccarat Programm? Allgemeine Java-Themen 13
8u3631984 Problem beim Mocken von Record Klassen Allgemeine Java-Themen 4
A Zweite Service Klasse beim Kompilieren Allgemeine Java-Themen 6
B Java Reflection Probleme beim wehcselseitigen Referenzieren zweier Klassen/Objekte Allgemeine Java-Themen 14
B Stringmanipulationen beim Dateinamen Allgemeine Java-Themen 8
B Woher kommen die Bildschirmkoordinaten beim java Robot? Allgemeine Java-Themen 14
Alex_99 Programm stürzt beim Aufruf der Funktion ab? Text ausgeben Allgemeine Java-Themen 45
J Mein Frame friert ein beim Uploaden Allgemeine Java-Themen 4
P Selenium Scriipt zeigt Fehler beim Import Allgemeine Java-Themen 3
A Hilfe beim Verständnis Allgemeine Java-Themen 16
stormyark Problem beim Klassen erstellen Allgemeine Java-Themen 1
K Verbesserung der Laufzeit beim Sortieren von Einwohnern nach ihrem Geburtsjahr Allgemeine Java-Themen 0
B Compiler-Fehler Probleme beim Kompilieren mit Jsoup Allgemeine Java-Themen 8
G javamail Problem beim Empfangen von Nachrichten Allgemeine Java-Themen 3
yakazuqi Fehler beim Laden. JDA (Java Discord API) Allgemeine Java-Themen 1
T Problem beim Umwandeln in eine Jar-Datei Allgemeine Java-Themen 3
W Suche Ursache für NPE - woher kommt sie? (Hilfe beim Debugging) Allgemeine Java-Themen 19
U Fehler beim Compillieren Allgemeine Java-Themen 13
B neuroph hält beim XOR lernen nicht an Allgemeine Java-Themen 13
bueseb84 Fehler beim Import von Maven Dependencies aus lokalem artifactory Allgemeine Java-Themen 2
J Jasper Report - seltame Meldung beim compilieren Allgemeine Java-Themen 3
J Linux .jar beim Start automatisch ausführen Allgemeine Java-Themen 6
T String-Manipulation beim Ablauf in Eclipse und als JAR-File Allgemeine Java-Themen 8
V Threads Probleme beim Aufrufen von Methoden einer anderen Klasse (Threads) Allgemeine Java-Themen 14
M Gibt es eine API die den aktuellen Wert eines Indikators beim Trading zurückgibt? Allgemeine Java-Themen 7
A Fehler beim Öffnen eines Projekts Allgemeine Java-Themen 6
L Compiler-Fehler Generics beim Anhängen von Predicates Allgemeine Java-Themen 1
J WARNING: An illegal reflective access operation has occurred, beim Compilieren von JasperReports, was bedeutet das ? Allgemeine Java-Themen 23
J Problem beim Umstellen auf Java jdk 13 Allgemeine Java-Themen 3
A Problem beim öffnen von Java-Installern Allgemeine Java-Themen 1
J Problem beim Generischen Klassen und Interfaces Allgemeine Java-Themen 2
C Fehler beim Debuggen von Listen Allgemeine Java-Themen 4
L File beim Kopieren in einen anderen Ordner umbenennen Allgemeine Java-Themen 6
B Input/Output Probleme beim Ausführen von Shell-Befehlen mit Java Allgemeine Java-Themen 28
J Probleme beim einbinden von Zip4j library Allgemeine Java-Themen 6
T Compiler-Fehler NoClassDefFoundError beim Laden einer Class Allgemeine Java-Themen 11
S Seitenausrichtung beim Drucken Allgemeine Java-Themen 1
RalleYTN Brauche Hilfe beim Run-Length-Decoding Allgemeine Java-Themen 9
R Optimierung beim Vergleichen von 2 Bildern Allgemeine Java-Themen 23
F SQLite mit Java / Probleme beim INSERT Befehl Allgemeine Java-Themen 4
I Fehler beim Ant-Package erstellen mit Java 9 Allgemeine Java-Themen 1
S Eclipse Probleme beim Implementieren / Ausführen von jUnit 5-Test Suites Allgemeine Java-Themen 14
M Beim Öffnen Dialog Directory und Filetype definieren Allgemeine Java-Themen 2
G Problem beim GUI Allgemeine Java-Themen 9
A Probleme beim Verstehen einer Aufgabenstellung Allgemeine Java-Themen 11
A OOP Problem beim Berechnen der größten Fläche eines Ringes Allgemeine Java-Themen 19
F Problem beim Einlesen einer Textdatei Allgemeine Java-Themen 12
J Konstruktor in JSP beim Kompilieren nicht gefunden Allgemeine Java-Themen 3
perlenfischer1984 Probleme beim Mocken Allgemeine Java-Themen 6
A Fehler beim Aktualisieren JTable Allgemeine Java-Themen 1
D Pivot-Wahl beim QuickSort steigert die Effizienz, eine Lüge??? Allgemeine Java-Themen 17
J-Gallus Erste Schritte Wahrscheinlich Anfänger Fehler beim rechnen. Falsches Ergebnis. Allgemeine Java-Themen 9
U Swing Hilfe beim Quellcode für ein Codierungs-/Decodierungsprogramm Allgemeine Java-Themen 9
Fischkralle Beim Clean Coden an den Schnittstellen geschnitten. Allgemeine Java-Themen 10
H Beim Konstruktor "this" Allgemeine Java-Themen 4
I Problem beim Aufrufen, von Objektmethoden/ -variablen Allgemeine Java-Themen 6
J Interpreter-Fehler Fehler beim Verschlüsseln Invalid AES key length Allgemeine Java-Themen 1
R probleme beim starten von jar unter linux Allgemeine Java-Themen 2
Thallius Swing Merkwürdiges Verhalten beim Panel Tausch Allgemeine Java-Themen 3
Tacofan Sound beim öffnen der GUI Allgemeine Java-Themen 8
Z NullPointerException beim Schreiben einer ArrayList in eine Datei Allgemeine Java-Themen 6
B Endlosschleife beim Verteilen von Objekten Allgemeine Java-Themen 4
V JavaFX Fehler beim Starten einer Jar Allgemeine Java-Themen 7
B Fortschritt beim Schreiben einer Datei ausgeben lassen Allgemeine Java-Themen 7
J JDK installieren Das Jdk funtioniert beim Editor nicht. Allgemeine Java-Themen 3
R Verdrückt beim Sicherheitshinweis Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben