M
MRspeed
Gast
Hallo!
Ich bin ziemlich neu in Java, sonst eher in PHP unterwegs und vor einiger Zeit mal in C++.
Ich habe folgendes Problem:
Ich habe circa 100 Dateien (Text-Dateien, je circa 200mb), wobei jede Zeile so aussieht: "wort wort wort wort wort zahl"
In diesen Daten muss ich nach den Zahlen suchen und die entsprechenden Worte ausgeben.
Mein Ansatz ist:
Ich lade mehrere Dateien nacheinander (also nur eine gleichzeitig) in ein String[] um darin dann effizient suchen zu können.
Das funktioniert generell auch gut, bis der Speicher ausgeht.
Ich habe in den Run-Configurations 1500mb freigegeben.
Nach dem Einlesen von drei Dateien hat der Java Prozess diese Größe erreicht und circa nach weiteren 6 Dateien bekomme ich einen OutOfMemoryError.
hier der vereinfachte Quelltext:
Immer noch recht komplex, aber ich wollte nicht zu viel weg lassen damit das Problem und mein Vorgehen deutlich wird.
Ich denke, dass der verwendete Speicher nicht schnell genug wieder frei gegeben wird und darum irgendwann einfach Schluss ist.
Kann mir bitte jemand helfen? Ich mache es auch gern ganz anders, also immer her mit guten Ideen.
Danke,
MRspeed
Ich bin ziemlich neu in Java, sonst eher in PHP unterwegs und vor einiger Zeit mal in C++.
Ich habe folgendes Problem:
Ich habe circa 100 Dateien (Text-Dateien, je circa 200mb), wobei jede Zeile so aussieht: "wort wort wort wort wort zahl"
In diesen Daten muss ich nach den Zahlen suchen und die entsprechenden Worte ausgeben.
Mein Ansatz ist:
Ich lade mehrere Dateien nacheinander (also nur eine gleichzeitig) in ein String[] um darin dann effizient suchen zu können.
Das funktioniert generell auch gut, bis der Speicher ausgeht.
Ich habe in den Run-Configurations 1500mb freigegeben.
Nach dem Einlesen von drei Dateien hat der Java Prozess diese Größe erreicht und circa nach weiteren 6 Dateien bekomme ich einen OutOfMemoryError.
hier der vereinfachte Quelltext:
Java:
//number of random numbers
int count = 50;
long[] x = generate_numbers(count);
long[][] f = create_file_array();
//write data in file:
BufferedWriter bb = new BufferedWriter (new FileWriter("C:/temp/result.txt"));
//remember which file is loaded in gram[][]
int file_open = 0;
//save file.line to resolve duplicates
Double[] found = new Double[count];
//saves data [line][word]
String[][] gram = null;
//line => summered counts
long[] counts = null;
Arrays.fill(found, 0.0d);
for (int i=0; i<count;++i){
try {
int file = ask_file(f,x[i]); // file in which the number can be found
if(file==0){
System.out.println( "file not found" );
System.exit(file);
}
if(file_open != file){
// wrong file loaded
file_open = file;
b = new BufferedReader (new FileReader("C:/temp/5gm-0"+(file<100?"0":"")+file+".txt" ));
gram = new String[(int) f[file][1]][5];
counts = new long[(int) f[file][1]];
String line;
int j = 0;
while((line = b.readLine()) != null) {
String[] temp = line.split("\\s+");
gram[j][0] = temp[0];
gram[j][1] = temp[1];
gram[j][2] = temp[2];
gram[j][3] = temp[3];
gram[j][4] = temp[4];
counts[j] = Long.valueOf(temp[5]);
j++;
}
b.close();
b = null;
}
//search number
int key = Arrays.binarySearch(counts, x[i]);
if(key < 0){
key = Math.abs(key)-1;
}
// save the number in found[] to avoid doubles
Double tempF = Double.valueOf(file+"."+key);
if(Arrays.binarySearch(found, tempF)<=0){
found[i] = tempF;
String someData = check(gram[key]);
bb.write(gram[key][0]+" "+gram[key][1]+" "+gram[key][2]+" "+gram[key][3]+" "+gram[key][4]+" : "
+someData);
bb.newLine();
} else {
System.out.println("query doubled");
}
}
catch (IOException e) {
System.out.println("Fehler: "+e.toString());
}
}
bb.close();
Immer noch recht komplex, aber ich wollte nicht zu viel weg lassen damit das Problem und mein Vorgehen deutlich wird.
Ich denke, dass der verwendete Speicher nicht schnell genug wieder frei gegeben wird und darum irgendwann einfach Schluss ist.
Kann mir bitte jemand helfen? Ich mache es auch gern ganz anders, also immer her mit guten Ideen.
Danke,
MRspeed