Daten effizient ein- und auslagern

B

Bob-omb

Gast
Hallo,

ich habe ein Programm, welches Klassifikatoren für die Gesichtserkennung trainiert. Bei jedem Trainingsdurchlauf sind sehr viele Berechnungen notwendig, was bedeutet, dass ein einziger Durchgang derzeit ca. 5 Minuten benötigt. Um ein akzeptables Ergebnis zu bekommen benötige ich jedoch einige Hundert solcher Durchgänge. Einen Großteil der Ergebnisse, die bei einem Trainingsdurchlauf berechnet werden, könnte ich theoretisch im nächsten Durchlauf wieder verwenden. Das Problem ist, dass die Datenmenge dabei zu groß wird, und meine 4GB Arbeitsspeicher dafür leider bei weitem nicht ausreichen. Ich habe jetzt versucht, die Ergebnisse auf Festplatte auszulagern - allerdings in sehr kleinen Schritten, was leider dazu geführt hat, dass die Lese-Schreib-Vorgänge länger dauern, als das Neuberechnen der Ergebnisse.

Die Situation sieht derzeit so aus: Ich habe eine ArrayList mit einigen zehntausend Klassifkatoren. Bei jedem Durchlauf wird nun das Ergebnis des Klassifkators auf jedem Trainingsbild berechnet. Eine der sehr aufwendigen Rechenoperationen ändert sich nicht, das heißt ich könnte einen Teil des Ergebnisses für jeden Klassifikator, auf jedem Trainingsbild auslagern. Die ArrayList hätte dann aber einige zehntausen Elemente, die wiederum einige zehntausend Ergebnisse speichern müssten - dafür habe ich leider zu wenig RAM.

Jetzt könnte ich natürlich das ganze schrittweise machen - z.b. die Ergebnisse von 1000 Klassifikatoren laden, Berechnung durchführen, anschließend die nächsten 1000 laden, usw. Das funktioniert aber leider nicht so einfach, da ich die Berechnung derzeit parallel in mehreren Threads laufen lasse, um alle Prozessorkerne auszunutzen. Jeder Thread arbeitet dabei in einem Teilbereich der ArrayList. Das heißt, jeder Thread müsste sich selbst darum kümmern, die benötigten Daten dynamisch ein- und auszulagern. Wobei man hier natürlich eine sinnvolle Schrittweite finden muss - es dürfen ja nicht zu viele Daten auf einmal im Arbeitsspeicher sein, auf der anderen Seite muss das Lesen/Schreiben von der Platte auch schneller gehen, als wenn ich die Rechnung einfach nochmal ausführe.

Das wäre jetzt auch das nächste, was ich versuchen würde. Aber vielleicht hat jemand ja noch ein paar Ideen, wie man mit so einem Problem umgeht? Oder gibt es vielleicht sogar irgendwelche Bibliotheken oder Datenbanksysteme, mit denen man Daten möglichst effizient und schnell ein- und auslagern kann?

Danke fürs Lesen :)
 

Empire Phoenix

Top Contributor
Hm eingentlich sit ne datenbank beim reinen elsen/schreiben langsamer, aber wenn du sychronization aund automatische auslagerung optimierung viel verwendeter ergebnisse benutzt, könnte das einen versuch wert sein. Versuch es doch einfach mla das ganze mithilfe einer mysql umzustetzen.

Bleibt noch die frage, wie speicherst du die arraylist? weil die java serialisierung ist sehr langsam im vergelich zu einer selbergeschreibenen.
Wenn du zb nur zahlen hast könnteste sowas wie
123123%231321%1312 machen und das selber parsen.
 

fastjack

Top Contributor
Möglichkeiten gibt es schon eine ganze Menge, aber ohne Einblick in deine Berechnungen, ist es schwer jetzt direkt eine zu nennen.

Ansonsten meine Erfahrung bei großen Datenimportbrummern:

- geschicktes Klassen/Datenmodell und geschickte Navigationsmöglichkeiten darin.
- bei Schreib- und Lesevorgängen (Filesystem, DB) immer Brökchen aufeinmal bearbeiten, nicht Zeile für lesen und schreiben.
- Suchvorgänge nach Elementen in großen Listen vermeiden, lieber eine Map verwenden, falls möglich.
- wenn was zu Cachen geht, cachen.
- VM- und Speicherfreundlich sein. Nicht benötigte Listen, Objekte etc. leeren oder nullen, nicht mehr Objekte erzeugen als nötig, sondern lieber resetten etc. Garbage collection ankitzeln etc.
- Bei Gesichtsberechnungen, Daten, die immer gleich sind zu einem Bild auslagern. Serialisieren?
- Speicher hochsetzen. Java Flags, z.B. "-server" probieren.
 

Janus

Bekanntes Mitglied
Ich hab eher das Gefühl, dass die Klassifikatoren zuviel Ballast mit sich rumschleppen. Die müssen sich doch nicht die Informationen für jedes Bild einzeln merken.
 

FArt

Top Contributor
Wenn die Objekte nicht mehr zu optimieren sind, kann man u.U. noch durch Persistierung mit klugem Caching (Files, DB) noch ein wenig Speicher sparen, u.U. aber wieder Performance verlieren. Es ist dann zu vergleichen, ob eine Neuberechnung besser ist als die Persistierung.
Oft muss man aber für eine gezielte Optimierung auch große Teile des eigentlichen Algorithmus der Verarbeitung anpassen, das ist eine größere Aufgabe und muss für jedes Problem anders gelöst werden.
Oder der Moneyansatz: ein 64-Bit Betriebsystem, viel Speicher und ein schnelles Dateisystem (z.B. SSD) ;-)
 
B

Bob-omb

Gast
Danke für die Antworten. Werde jetzt nochmal große Teile des Programms umschreiben und versuchen so sparsam wie möglich zu sein. Derzeit gibt es für jeden Blödsinn ein eigenes Objekt, obwohl einfache Arrays in den meisten Fällen genügen würden. Das mit dem selbst serialialisieren werden ich auch mal ausprobieren und vergleichen.

Habe nochmal versucht die Ergebnisse auszulagern, was leider an meinen langsamen Festplatten scheitert. Das Speichern dauert einfach zu lange. Liegt aber evtl. auch an dem etwas ungünstigen Softwaredesign, da ich derzeit alles serialisiere und jedes Objekt noch eine Vielzahl an anderen Objekten mit sich herumschleppt. Werde mir mal ansehen, ob ich das alles wirklich brauche.

Der Moneyansatz wird leider nichts, bin ein armer Student :)
 

LoR

Bekanntes Mitglied
Werde jetzt nochmal große Teile des Programms umschreiben und versuchen so sparsam wie möglich zu sein. Derzeit gibt es für jeden Blödsinn ein eigenes Objekt, obwohl einfache Arrays in den meisten Fällen genügen würden.

Das ist der richtige Ansatz. Vermeide wenn möglich Objektstrukturen, dass spart enorm viel Speicher.

Darüber hinaus wie hast du denn bisher die Objekte auf die Platte geschrieben? Etwa durch Serialisierung der gesamten Arraylist? Wenn ja, dann liegt dort das Performanzproblem. Zusätzlich werden durch Serialisierung unnötig (in diesem Fall) viele Daten auf die Festplatte geschrieben.

Statt die Objekte zu serailisieren speichere deren Attribute in einem (eigenen) Binärformat (Stichwort: NIO, JDK 1.4.2 New I/O-related APIs & Developer Guides -- from Sun Microsystems). Das spart Speicher und sollte auch beim einlesen einen ordentlichen Performanzschub geben.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Daten effizient verwalten Allgemeine Java-Themen 4
I Mehrere Klassen mit den selben Daten Allgemeine Java-Themen 5
padde479 Collections Daten in Dreiecksform Allgemeine Java-Themen 13
V Umgang mit fehlenden Daten in einer Java-Datenanalyseanwendung Allgemeine Java-Themen 5
torresbig Url nach Webseiten-Login auslesen & Daten an Webseite senden Allgemeine Java-Themen 9
A Hartgecodete Daten auslagern Allgemeine Java-Themen 4
F Laden von bestimmten Daten aus TAR Archiv Allgemeine Java-Themen 23
S Webservices für binäre Daten? Allgemeine Java-Themen 5
OnDemand Daten in RAM zwischenspeichern oder lieber aus DB holen? Allgemeine Java-Themen 24
J Daten über serielle Schnittstelle empfangen Allgemeine Java-Themen 4
J JSON Daten von einer Webseite erhalten Allgemeine Java-Themen 2
S Entities aus XML - Daten. Allgemeine Java-Themen 1
M Schnelleres Speichern von XML-Daten über URLConnection Allgemeine Java-Themen 4
kodela Klasse mit "gezipten" Daten Allgemeine Java-Themen 6
M Daten aus MatLab Datei lesen Allgemeine Java-Themen 8
N Daten einer JCoTable in JTextArea anzeigen Allgemeine Java-Themen 7
kodela Klassen Klasse "vergisst" ihre Daten Allgemeine Java-Themen 2
C Daten für Klassifikationsverfahren gewinnen Allgemeine Java-Themen 6
J Daten von Quelltext Allgemeine Java-Themen 5
K OOP Daten addieren sich bei GUI-Eingabe Allgemeine Java-Themen 10
J Jasper Reports - Daten vom Hoster Allgemeine Java-Themen 2
kodela Daten während Laufzeit zugriffsbereit Allgemeine Java-Themen 15
J Millisekunde zwischen 2 Daten Allgemeine Java-Themen 6
Q Selbständig ActionEvent auslösen zum Daten senden über serielle Schnittstelle Allgemeine Java-Themen 7
J Daten aus Website-Quelltext auslesen Allgemeine Java-Themen 62
R Android Daten online senden Allgemeine Java-Themen 0
P Datenbank-MiniGUI fügt keine Daten ein Allgemeine Java-Themen 4
K Gespeicherte Daten von einer LinkedList auf vier LinkedList verteilen Allgemeine Java-Themen 6
Q-bert Daten von Java Programm speichern Allgemeine Java-Themen 4
K Datei (CSV-ähnlich) in Java einlesen & mit teil der Daten Graphen erstellen Allgemeine Java-Themen 9
A Erste Schritte Daten aus einer Website auslesen Allgemeine Java-Themen 7
OnDemand Desktop-Applikation schreiben, wie daten persistent? Allgemeine Java-Themen 9
S Erste Schritte Fehlender Gedanken-Ansatz bei Interpretation von Daten Allgemeine Java-Themen 1
J Auslesen Daten Java/HTML Allgemeine Java-Themen 15
K Große Mengen an Daten speichern Allgemeine Java-Themen 9
D Daten in MySQL-Datenbank schreiben Allgemeine Java-Themen 13
A Swing FileWriter schreibt keine Daten in Datei Allgemeine Java-Themen 13
M Daten aus anderen Programmen auslesen Allgemeine Java-Themen 2
D Best Practice Login-Daten: Wie am besten abrufen? Allgemeine Java-Themen 6
L Best Practice Log Dateien analysieren und eventuell passende Daten am Chart darstellen Allgemeine Java-Themen 1
J Serial Port Daten empfangen Allgemeine Java-Themen 5
H Daten via COM Schnittstelle erhalten Allgemeine Java-Themen 2
J Daten persistent speichern Allgemeine Java-Themen 14
S Allgemeine parallelisierte Loesung um Daten im Hintergrund zu laden..? Allgemeine Java-Themen 6
L Daten ohne Datenbank richtig abspeichern Allgemeine Java-Themen 5
G Daten aus Website auslesen Allgemeine Java-Themen 7
J Daten aus GUI auslesen und in Objekte umwandeln Allgemeine Java-Themen 6
O Serial Port Daten als Tastaturanschlag senden Allgemeine Java-Themen 0
N Zeitabstand zwischen 2 Daten(Mehrzahl von Datum) Allgemeine Java-Themen 3
T Input/Output Daten in eine Datei schreiben Allgemeine Java-Themen 4
Z daten bindung Allgemeine Java-Themen 1
A Datentypen Gregorian Calendar - 2 Daten sind gleich?? Allgemeine Java-Themen 3
L Vergleich-Xml-Daten Allgemeine Java-Themen 3
vandread Daten verschlüsseln mit Java oder Datenbank Allgemeine Java-Themen 15
A Daten in Formularen/Vorlagen erstellen und ausdrucken Allgemeine Java-Themen 3
C HtmlUnit Daten einer Tabelle bekommen ohne, dass diese eine ID aufweist Allgemeine Java-Themen 1
T Daten über port abfangen mit proxy server Allgemeine Java-Themen 12
Todesbote Excel Blattschutz aufheben und Daten einfügen Allgemeine Java-Themen 3
T Mit Apache Poi Daten aus einer Excel Tabelle kopieren und in Word einfügen Allgemeine Java-Themen 1
OnDemand PC identifizieren / Daten auslesen Allgemeine Java-Themen 15
G Combobox füllen mit daten aus einer Tabelle Allgemeine Java-Themen 4
J Maven .war enthält veraltete Daten Allgemeine Java-Themen 3
N Daten aus Jar laden Allgemeine Java-Themen 10
P Datentypen String-Daten zu Byte-Zahlen konvertieren - Komme nicht weiter nach vielem versuchen :-/ Allgemeine Java-Themen 7
K Input/Output Daten speichern / laden Allgemeine Java-Themen 2
M Best Practice: Daten aufnehmen-speichern-bereitstellen Allgemeine Java-Themen 8
B JTable eigene Daten Add Methode Allgemeine Java-Themen 2
S OOP Apache Commons Math - Verwendung von Genetics - Wie werden Daten in Chromosomen gespeichert? Allgemeine Java-Themen 4
C Daten über URL an PHP verschicken Allgemeine Java-Themen 4
R Daten aus DB auslesen in ein formular (JSP) Allgemeine Java-Themen 13
S Library fuer Internet-Text-Daten-Quellen..? Allgemeine Java-Themen 8
H OOP Daten über TCP Allgemeine Java-Themen 5
H Input/Output Binäre Daten konvertieren, Output hat Zeilenumbrüche?? Allgemeine Java-Themen 9
D Daten eines User auslesen. Allgemeine Java-Themen 5
B Input/Output Einbinden von Daten in Java Allgemeine Java-Themen 3
L Einbinden von Daten in ausführbare Jar Allgemeine Java-Themen 6
N Methoden Einzelne Daten aus "Person" auslesen Allgemeine Java-Themen 3
R SerialPort auslesen und Daten verarbeiten Allgemeine Java-Themen 23
ARadauer Wo liegen die Daten der Preferences Klasse Allgemeine Java-Themen 3
Madlip Erste Schritte Java speichert Daten im Programm?!? Allgemeine Java-Themen 9
S JDialog Daten ins JFrame übergeben Allgemeine Java-Themen 5
F Threads synchronisierung des Zugriffes auf daten Allgemeine Java-Themen 4
O Amazon S3 Anmelden / Daten downloaden Allgemeine Java-Themen 2
A Daten aufbereiten Allgemeine Java-Themen 11
P Daten kopieren mit nio - Zugriff verweigert Allgemeine Java-Themen 8
L Speichern von Daten in JKS Allgemeine Java-Themen 5
K JFreeCharts - Dummy für fehlende Daten Allgemeine Java-Themen 6
M Daten aus doc, pdf .... auslesen Allgemeine Java-Themen 12
Z Daten von einer Klasse in eine andere übertragen Allgemeine Java-Themen 8
A Login-Daten Formular automatisch ausfüllen Allgemeine Java-Themen 10
C Daten speichern und verwalten Allgemeine Java-Themen 3
Z Daten aus einer Internetseite auslesen? Allgemeine Java-Themen 2
E BlueJ Daten in Textdatei schreiben Allgemeine Java-Themen 21
T Gleichzeitige Zugriffe auf Daten auf dem Server Allgemeine Java-Themen 11
ruutaiokwu META-INF-daten bei ungepackten library-projekten während der entwicklung mit einbeziehen...? Allgemeine Java-Themen 2
K Server Daten Visualisieren Allgemeine Java-Themen 3
F HashMap überschreibt Daten von anderen HashMap Allgemeine Java-Themen 5
A Java Projekt (Daten Eingeben, Speichern und in Listen Ausgeben) Allgemeine Java-Themen 6
L Sicherstellen das 2x die gleichen Daten unter bestimmten Keys enthalten sind. Allgemeine Java-Themen 6
A XML-Daten komprimieren Allgemeine Java-Themen 6

Ähnliche Java Themen

Neue Themen


Oben