Hi,
ich möchte eine ca. 1GB große Textdatei einlesen die im Prinzip das folgende Format aufweist:
Name1 [tab] wert1 [tab2] wert3 [tab] ...
Name2 [tab] wert1 [tab2] wert3 [tab] ...
Es handelt sich hier um eine Größenordnung von ca. 50.000 Objekten mit je 1.300 Werten. Sofern ich die zugehörigen Instanzen mit Zufallszahlen fülle, funktioniert das tadellos. Wenn ich die Daten aber aus einer Datei einlese, reichen 4GB RAM dafür nicht aus. Die Fehlermeldung ist zum einen ein voller Heapspace und zum anderen diese GC Warnung, da selbiger mit dem Aufräumen nicht hinterherkommt. Heapspace wurden bereits auf ein Maximum gesetzt und auch die GC Unterdrückung wurde probiert.
Wie kann ich diesen Flaschenhals umgehen?
Folgend der abgespeckte Code. Jede Zeile repräsentiert also ein Objekt, die zugehörige Klasse ist die folgende:
Diese Objekte möchte ich zur späteren Weiterverarbeitung speichern:
Das Hauptprogramm sieht wie folgt aus:
ich möchte eine ca. 1GB große Textdatei einlesen die im Prinzip das folgende Format aufweist:
Name1 [tab] wert1 [tab2] wert3 [tab] ...
Name2 [tab] wert1 [tab2] wert3 [tab] ...
Es handelt sich hier um eine Größenordnung von ca. 50.000 Objekten mit je 1.300 Werten. Sofern ich die zugehörigen Instanzen mit Zufallszahlen fülle, funktioniert das tadellos. Wenn ich die Daten aber aus einer Datei einlese, reichen 4GB RAM dafür nicht aus. Die Fehlermeldung ist zum einen ein voller Heapspace und zum anderen diese GC Warnung, da selbiger mit dem Aufräumen nicht hinterherkommt. Heapspace wurden bereits auf ein Maximum gesetzt und auch die GC Unterdrückung wurde probiert.
Wie kann ich diesen Flaschenhals umgehen?
Folgend der abgespeckte Code. Jede Zeile repräsentiert also ein Objekt, die zugehörige Klasse ist die folgende:
Java:
public class Probeset {
public String id = "";
public double [] values = new double[1500];
public Probeset() {}
}
Diese Objekte möchte ich zur späteren Weiterverarbeitung speichern:
Java:
public class Probesets {
public Probeset [] content = new Probeset[60000];
public Probesets() {}
}
Das Hauptprogramm sieht wie folgt aus:
Java:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.LineNumberReader;
import java.util.Random;
import v4.model.Probesets;
import v4.model.Probeset;
public class programm {
static Probesets probesets = new Probesets();
public static void main(String[] args) {
final String FILENAME = "data/tempfile_54000-1360.csv";
try {
BufferedReader br = new BufferedReader(new FileReader(FILENAME));
int counter = 0;
while (br.ready()) {
String current_line = br.readLine();
// erste Zeile enthält Ueberschriften
if(counter > 1)
fetch(current_line, counter);
// Statusmeldung
if(counter % 500 == 0)
System.out.println(counter);
counter++;
}
br.close();
} catch ( IOException e ) {
System.out.println("Datei nicht vorhanden!");
}
}
public static void fetch(String _input, int counter){
String [] tmp = _input.split("\t");
Probeset probeset = new Probeset();
probeset.id = tmp[0];
for (int i = 2; i < tmp.length; i++){
probeset.values[i-2] = Double.parseDouble(tmp[i]);
}
probesets.content[counter] = probeset;
}
}