Grosse dateien parsen

hallo,

ich habe ein problem beim parsen sehr grosser textdateien (10MB). beim rausschreiben erzeugt er nur noch dateien die 64K gross sind (d.h. er bricht dann ab). die zieldatei soll übrigens nur ein bruchteil so gross werden wie die quelldatei.

zum einlesen verwende ich den BufferedReader(Reader in, int sz):

int size = (int)(new File(src)).length();
BufferedReader br = new BufferedReader (new FileReader(src), size);

ich glaube da liegt das problem nicht, sondern eher beim schreiben der zieldatei:

String line, something;
FileWriter fw = new FileWriter(dest);
while((line = br.readLine()) != null) {
//do something
fw.write(something);
}

hat jemand einen tipp für mich? vielleicht noch zur information: ich möchte in zukunft die eingelesenen datensätze in ein xml-file schmeissen…

gruss
christian

Hallo!

Du solltest mal geanu aufpassen, was so passiert, wenn du
eine zeile liest. Debugger benutzen, oder println !!

  • Was steht in der Zeile?
  • wie lange ist die Zeile?
  • schreibt er sie auch genau so wieder raus?

Ich brauche mehr infos.

Ich hatte mal das Problem bei jdk1.2, da war die max.-laenge
eines String auf 64 Kb beschränkt. Seit jdk1.3 ist das
kein Problem mehr.

Franz

Hallo Franz,

danke für deine Antwort. Hier mehr Infos:
In der Quelldatei stehen etwa 21.000 Datensätze. Diese lese ich zeilenweise ein, parse sie und schreibe in etwa 7.000-8.000 raus (zeilenweise) in die Zieldatei (Die Zieldatei ist und soll dann auch um ein vielfaches kleiner sein, Faktor 10 bis 100!). Dies macht er auch richtig, aber aus irgendeinen Grund bricht er ca. bei der 6.000ten Zeile plötzlich ab. Interessanterweise hat die Datei dann genau 64kB.

Ein zeilenweises Debuggen bringt hier glaube ich aber nicht so viel, da er, wie gesagt, davor alles richtig macht. Die Zeilen an sich sind eher kurz (10-15 Zeichen), an die Grenzen des einzelnen Strings stossen wir also nicht, allerdings wohl offensichtlich irgendwie an die des BufferedReader oder des FileWriter.

Gibt es keine praktikable Lösung für Dateioperationen in dieser Grössenordnung (1MB, 10MB)? Übrigens, ich benutze J2SE 1.4.0

Gruss
Christian

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi,

ich zeilenweise ein, parse sie und schreibe in etwa
7.000-8.000 raus (zeilenweise) in die Zieldatei (Die Zieldatei
ist und soll dann auch um ein vielfaches kleiner sein, Faktor
10 bis 100!). Dies macht er auch richtig, aber aus irgendeinen
Grund bricht er ca. bei der 6.000ten Zeile plötzlich ab.

Wie und wo genau? Kommt eine Exception? Welche?
Beim Lesen der Zeile, beim parsen, beim schreiben?
Es kann so vieles sein, ich brauche noch mehr infos.
Stichwort IndexOutofBoundsException, NullpointerException
usw.

Interessanterweise hat die Datei dann genau 64kB.

Mach mal ein flush() und am Ende das close() nicht vergessen.

Ein zeilenweises Debuggen bringt hier glaube ich aber nicht so
viel, da er, wie gesagt, davor alles richtig macht. Die Zeilen

Ja, ganau da wo er aussteigt, solltest du mit dem Debugger reingehen.

an sich sind eher kurz (10-15 Zeichen), an die Grenzen des
einzelnen Strings stossen wir also nicht, allerdings wohl
offensichtlich irgendwie an die des BufferedReader oder des
FileWriter.

flush()

Gibt es keine praktikable Lösung für Dateioperationen in
dieser Grössenordnung (1MB, 10MB)? Übrigens, ich benutze J2SE

Egal wie du das machst, du musst wohl alle Zeichen einmal lesen.
Und da du alles direkt rausschreibst, wird es wohl nicht am kleinen RAM liegen.

Also: mehr infos.

Franz

1 „Gefällt mir“

flush() war ein guter tipp :smile:
Hi,

vielen Dank. Jetzt schreibt er das File offensichtlich zu Ende. Zu deiner Info: er schrieb nie irgendwelche Exceptions raus, der Buffer war nur anscheinend einfach voll. MIr war die Bedeutung von flush nie klar… aber ok, jetzt bin ich schlauer

Gruss
Christian

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]