System.gc() ?

@tekilla
ich denke mal dass bei dir wegen dem BufferedReader der OutOfMemoryError kommt. Der puffert ja den ganzen Text aus der Datei. Das ist aber halt nur eine Vermutung.
Weißt du denn bei welcher Zeile der Error auftritt?

MFG

zEriX

Wie kann ich readLine() ohne Bufferred Raeder implementieren?

wie bereits erwähnt kommt der fehler bei ca 1300ter Zeil (wenn der Speicher eben Voll ist).
 
Das kann nicht das Problem sein. Der BufferedReader puffert zwar den Strom, aber er liest nicht dasganze File auf einmal ein. Ich habe schon Gigabyte große Dateien damit verarbeitet, ohne Probleme.

Zum Ermitteln der Zeilenzahl, wirst Du wohl die komplette Datei lesen müssen. Das geht mit Klassen aus dem java.nio Paket sehr schnell. Ich würde an Deiner Stelle schätzen. Die Zahl der Bytes kannst Du leicht ermitteln. Wenn Du ungefähr die Zahl der Bytes pro Zeile weisst, kannst Du damit die ProgressBar füttern.

Gruß
 
Hab mal versucht keinen BufferredReader zu verwenden und readLine()
wie folgt implementiert:
Code:
FileReader fr = new FileReader(importFile);
String line ="";
char c;
int i=0;
do 
{
	c = (char)fr.read();
	line += c;
	i++;
}
while (c != '\n');

das bringt aber nix!
ich hab immernoch mein Speicherproblem:(

Bitte helft mir jemand
 
vllt StringBuilder verwenden?
denn wenn du an einen String etwas hinten anfügst wird ein neuer erstellt, wenn du so kurz nacheinander dutzende von neuen Strings erstellst, haut sich der Speicher natürlich voll.
 
Vielleicht ist Dein Problem an einer ganz anderen Stelle. Schmeiss doch mal alles aus Deinem Programm raus, ausser dem Buffered Reader und bau langsam alles ein bis der Fehler wieder auftritt. Wenn Du den Fehler schon beim Reader hast, poste doch mal den vollständigen Code, sonst kann man Dir schwer helfen.

Ist das Lesen denn Dein Problem, oder das Befüllen der Daten für die JTable? Befüllst Du die Table aus dem File, oder der DB? Da kannst Du die Daten nartürlich ganz im Speicher halten. Da musst Du eine Klassen schreiben, welche die Daten puffert und lazy bei Bedarf nachläd. Aus Performancegründen würde ich immer Blöcke laden.

Wenn Du die Table aus dem File füllst, würde ich Dir wieder die Pakete aus java.nio ans Herz legen. Die sind schnell und haben Puffer mit denen man gut Arbeiten kann. Wenn Du sie aus der DB füllst, gibst es im Netz eine Menge geigneter Algorithmen.

Gruß
 
vllt StringBuilder verwenden?
denn wenn du an einen String etwas hinten anfügst wird ein neuer erstellt, wenn du so kurz nacheinander dutzende von neuen Strings erstellst, haut sich der Speicher natürlich voll.


In der Tat, habe ich übersehen. Nimm doch Stringbuffer, bzw. Stringbuilder dafür. Ist auch schneller... Dennoch, ein lauffähiges Codebeispiel zum nachvollziehen des Fehler wäre nett.
 
Keine Ahnung, ob das geht :).
Ansatz:


<äußere Schleife>
Man liest in einer Schleife Zeichen aus der Datei, bis das Zeichen nicht "\n" ist, sprich end of line, dabei werden gelesene Zeichen gepuffert.
Wenn das Zeichen "\n" ist, wird ein Eintrag für die DB erzeugt.
Es wird die Zeichenstelle gemerkt und beim nächsten Durchgang wird ab der Stelle+1 <-- das wäre dann die nächste Zeile, weitergelesen.
</äußere Schlefe>

Wenn es keine Zeichen mehr gibt, wird die äußere Schleife verlassen.

Man könnte das ausprobieren oder irgendie in der Richtung. Dabei wird nur die aktuelle Zeile im Speicher gehalten.

Oder irre ich mich?
 
Dieser Code erzeugt ohne Probleme ein Gigabyte großes File und liest es wieder aus. Dabei gibt es keine Speicherprobleme. Also worüber reden wir hier?

Java:
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;


public class CreateBigFile {

	/**
	 * @param args
	 * @throws Exception 
	 */
	public static void main(String[] args) throws Exception {
		
		String zeile = "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789";
		FileOutputStream outStream = new FileOutputStream("bigfile.txt");
		PrintWriter out = new PrintWriter(outStream);
		for (int i = 0; i < 10000000; i ++)
			out.println(zeile);
		
		out.close();
		int i = 0;
		BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("bigfile.txt")));;
		while ( (zeile = reader.readLine()) != null){
			if ((i++ % 100000) == 0 )
				System.out.println("Lesepunkt" + i);
		}
		
		reader.close();
	}

}
 
Zurück