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
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