Dateien lesen/schreiben und Heap Space Probleme

Status
Nicht offen für weitere Antworten.

muemmel_0811

Bekanntes Mitglied
Hallo zusammen,

ich hab mir hier ein kleines Progrämmchen gebastelt, das alle html-Dateien eines Verzeichnisses durchläuft, nach einem best. RegEx-Muster darin sucht und diesen an der ersten Fundstelle ersetzt und dann die Daten wieder zurückschreibt.
Das funktioniert auch alles bestens, bis ich an Dateien gerate, die größer als 1 MB sind, dann steigt das Programm aus und folgende Fehlermeldung erscheint:
Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space

Der Code:
Code:
import java.util.regex.*;
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class FirstMatch extends JFrame{
	
	private static final long serialVersionUID = 1L;
	JLabel lblPfad = new JLabel("Pfad: ");
	JTextField inPfad = new JTextField();
	JButton go = new JButton("Go !");
	JLabel lblMuster = new JLabel("Suche: ");
	JTextField inMuster = new JTextField();
	JLabel lblRep = new JLabel("Ersetze: ");
	JTextField inRep = new JTextField();
	//JLabel lblZeig = new JLabel();
	Pan pan = new Pan();
	
	FirstMatch() {
		super();
		setTitle("FirstMatch");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		initLaF();
		setLayout(new BorderLayout());
		getContentPane().add(pan, BorderLayout.CENTER);
	}
	
	public class Pan extends JPanel {
		private static final long serialVersionUID = 1L;
		JTextArea textfeld = new JTextArea(20,30);
		//JTextField auswahl = new JTextField();
		Pan() {
			super();
			setLayout(null);
			lblMuster.setBounds(10,10,50,20);
			add(lblMuster);
			inMuster.setBounds(60,10,700,20);
			add(inMuster);
			lblRep.setBounds(10,40,50,20);
			add(lblRep);
			inRep.setBounds(60,40,700,20);
			add(inRep);
			lblPfad.setBounds(10,60,50,40);
			add(lblPfad);
			inPfad.setBounds(60,70,700,20);
			add(inPfad);
			go.setBounds(10,100,200,20);
			add(go);
			//auswahl.setBounds(230,100,100,20);
			//add(auswahl);
			go.addActionListener(new Liste());
			textfeld.setBounds(10,130,770,190);
			add(textfeld);
		}
	}
	
	class Liste implements ActionListener{
		public void actionPerformed(ActionEvent ae) {
			String p = inPfad.getText();
			File f = new File(p);
			listen(f);
		}
	}
	
	class DateiFilter implements FileFilter {
		private String ende;
		public DateiFilter(String endung) {
			ende = endung;
		}
		public boolean accept(File dat) {
			if(dat.isDirectory() == true) {
				return true;
			}
			else {
				if(dat.getName().endsWith(ende) == true) {
					return true;
				}
				else {
					return false;
				}
			}
		}
	}

	int gesamtCnt = 0;
	int matchCnt = 0;
	void listen(File dir) {
		DateiFilter filter = new DateiFilter(".html");
		File[] dateien = dir.listFiles(filter);
		if(dateien != null) {
			for(int i=0; i<dateien.length; i++) {
				if(dateien[i].isDirectory()) {
					listen(dateien[i]);
				}
				if(dateien[i].isFile()) {
					System.out.println(dateien[i]);
					gesamtCnt++;
					try {
						BufferedReader rein = new BufferedReader(new FileReader(dateien[i]));
						StringBuffer puffer = new StringBuffer();
						String zeile;
						while((zeile = rein.readLine()) != null) {
							puffer.append(zeile);
							puffer.append('\n');
						}
						rein.close();
						String inhalt = new String(puffer);
						pan.textfeld.setText("");
						pan.textfeld.setText(inhalt);
						pan.textfeld.setCaretPosition(0);
						pan.textfeld.selectAll();
						String regMus = inMuster.getText();
						String repText = inRep.getText();
						Pattern p = Pattern.compile(regMus);
						Matcher m = p.matcher(pan.textfeld.getSelectedText());
						if(m.find() == true) {
							matchCnt++;
							String result = m.replaceFirst(repText);
							pan.textfeld.selectAll();
							pan.textfeld.setText(result);
							BufferedWriter raus = new BufferedWriter(new FileWriter(dateien[i]));
							pan.textfeld.selectAll();
							String merk = pan.textfeld.getSelectedText();
							raus.write(merk);
							raus.close();
						}
					}
					catch(Exception e) {
						e.printStackTrace();
					}
				}
			}
		}
		System.out.println("Dateien gesamt: " + gesamtCnt);
		System.out.println("geänderte Dateien: " + matchCnt);
	}


	public void initLaF() {
		try {
			UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
			SwingUtilities.updateComponentTreeUI(this);
			SwingUtilities.updateComponentTreeUI(pan);
		}
		catch(Exception c){
		}
	}

	public static void main(String[] args) {
		JFrame fenster = new FirstMatch();
		fenster.setSize(800,360);
		fenster.setLocation(200,200);
		fenster.setVisible(true);
		fenster.setResizable(false);
	}

}

Was muss ich tun, damit mein Progrämmchen auch große Dateien verarbeiten kann oder muss ich mich geschlagen geben?

Grüße,
muemmel
 

HaBaLeS

Aktives Mitglied
In deiner Listen Methode kopiertst du den String "Inhalt" bzw. "Puffer" mehrfach, was jeweils zusätzlichen Speicher in der größe der Datei verbraucht. Hier kannst du sicherlich noch was optimieren.

Wenn du dann immernoch den Heap zum anschlag bringst, da die Dateien einfach zu groß sind, musst du der VM beim Start der App sagen, das mehr Maximaler Heap zur verfügung steht.

java -Xms <size>
Set initial Java heap size. Default: Xms32m

java -Xmx<size>
set maximum Java heap size. default:Xmx128m

z.B.

java -Xms=32m -Xmx=256m <Klassenname>
 

anfänger15

Bekanntes Mitglied
Wiso ließt du zuerst die gesamte datei ein ?

dein Code:
Code:
                  while((zeile = rein.readLine()) != null) {
                     puffer.append(zeile);
                     puffer.append('\n');
                  }

wäre es nicht logischer, wenn du nur ein teil (z.B. eine Linie) einließt und dann wieder in die datei schreibst. Dann das gleiche wieder von forne?

Das würde das Problem mit dem java heap space beheben
 

muemmel_0811

Bekanntes Mitglied
Hallo Ihr,

so, hab mein Progrämmchen jetzt etwas umgeschrieben, aber das Heap Space-Problem bleibt leider - egal ob ich mit Xms starte oder nicht. Das Problem hab ich mittlerweile auch gefunden und zwar liegt es am RegEx-Teil, denn irgendwie will das einfach keine 8 MB großen Dateien verarbeiten...
Und so helf ich mir jetzt anders und schließe eben genau diese übergroßen Dateien vom Prozess aus und bearbeite die dann von Hand (sind zum Glück nur eine Handvoll).

Grüße,
muemmel
 

HaBaLeS

Aktives Mitglied
Lies die großen Files halt in mehreren Teilen von jeweils z.B. 512k Blöcken. An den "Schnittstellen" musst du etwas aufpassen aber ansonsten sollte das kein Problem darstellen.
 

muemmel_0811

Bekanntes Mitglied
Hallo HaBaLeS,

das portionsweise Einlesen macht keinen Sinn, denn ich suche ja das 1. Vorkommen eines Strings in dieser Datei und möchte nur diesen einen ersetzen. Und wenn ich dann pro Portion einen Treffer hab, dann hilft mir das nicht wirklich...

Aber trotzdem Danke nochmal!

Grüße,
muemmel
 

der JoJo

Bekanntes Mitglied
lies doch einfach die datei zeichen für zeichen aus einem Stream, und versuche währenddessen den suchstring zu finden.
schreibe jedes zeichen direckt in eine andere File bis du den Suchstring gefunden hast.
hast du dann den String gefunden, erstzte in mit what ever und schreibe den rest des Streams hinterher:
 

der JoJo

Bekanntes Mitglied
hatte gerade nichts anderes zu tun :wink:

Code:
try
		{
			String gesucht="rofllol";
			String neu="ersetzt!";
			String derKoennteEsSein="";
			int getroffeneZeichen=0;
			File fIn=new File("lol.txt");
			File fOut=new File("rofl.txt");
			FileReader frIn=new FileReader(fIn);
			FileWriter frOut=new FileWriter(fOut);
			int gelesen;
			do
			{
				gelesen=frIn.read();
				System.out.println("Gelesen: "+gelesen+" als char: "+(char)gelesen);
				if(gelesen==gesucht.charAt( getroffeneZeichen ))
				{
					getroffeneZeichen++;
					derKoennteEsSein+=(char)gelesen;
					if(gesucht.equals( derKoennteEsSein ))//treffer
					{
						//die ersetzung schreiben
						frOut.write( neu );
						
						//den rest der File schreiben
						gelesen=frIn.read();
						while(gelesen>0)
						{
							frOut.write( gelesen );
							gelesen=frIn.read();
						}
						frOut.flush();
						frOut.close();
					}
				}
				else
				{
					if(getroffeneZeichen!=0)
					{
						getroffeneZeichen=0;
						frOut.write( derKoennteEsSein );
						derKoennteEsSein="";
					}
					frOut.write( gelesen );
				}
			}while(gelesen>0);
			
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
das müste eigendlich für dateien beliebiger größe funzen (hab gerade keine größer als 70mb aber die hat gefunzt)

#edit sry, hab gerade erst gelesen das du das mit regEx machen willst.
naja vieleicht hat dir mein quelltext dennoch einen kleinen denkanstoß gegeben
 

muemmel_0811

Bekanntes Mitglied
Hallo JoJo,

Danke für Deinen Tipp - ich werde mir den bei Gelegenheit mal zu Gemüte führen, denn das würde ja auch noch bedeuten, dass ich sämtliche Files neu erstellen, die alten löschen und dann noch die Neuen in den alten Dateinamen umbenennen muss. Und für solch eine Aktion brauch ich Newbee einfach ein bisschen mehr (Denk-)Zeit, als mir gerade zur Verfügung steht.

Wenn's soweit ist, dann meld ich mich hier wieder.

Danke nochmal,
muemmel
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Dateien lesen und schreiben Java Basics - Anfänger-Themen 5
F Input/Output Dateien lesen/schreiben Java Basics - Anfänger-Themen 1
S Lesen und Schreiben von Dateien in Java Java Basics - Anfänger-Themen 11
K Dateien lesen | IndexOutOfBoundsException Java Basics - Anfänger-Themen 2
I Methoden zum lesen und speichern von Dateien Java Basics - Anfänger-Themen 2
M Dateien erstellen/ bearbeiten/ lesen Java Basics - Anfänger-Themen 9
F Dateien lesen klappt nicht Java Basics - Anfänger-Themen 2
N Lesen aus (Text)Dateien Java Basics - Anfänger-Themen 7
J Vernünftig Dateien byteweise lesen Java Basics - Anfänger-Themen 5
C Problem mit Lesen und Speichern und Verarbeiten von großen Text Dateien Java Basics - Anfänger-Themen 5
X mehrere Dateien lesen/verarbeiten Java Basics - Anfänger-Themen 3
S Dateien von Server lesen & downloaden Java Basics - Anfänger-Themen 2
F TXT Dateien mal anders lesen Java Basics - Anfänger-Themen 11
C Kann man class Dateien auch lesen? Java Basics - Anfänger-Themen 8
M Probleme floats aus Dateien zu lesen Java Basics - Anfänger-Themen 2
M Problem mit setText() und lesen von .doc- und .pdf-Dateien Java Basics - Anfänger-Themen 6
H .java Dateien in Eclipse einbinden und ausführen Java Basics - Anfänger-Themen 1
I Dateien aus dem Resource Folder laden Java Basics - Anfänger-Themen 2
A Thread XML-Dateien zusammenfügen Java Basics - Anfänger-Themen 11
Buroto Threads Verschiedene .txt Dateien Auf Listen und Verbinden Java Basics - Anfänger-Themen 3
B Jar Dateien ohne IDE verwenden? Java Basics - Anfänger-Themen 1
A Optimierung eines Programms: Mergen der Dateien Java Basics - Anfänger-Themen 23
A Zwei XML-Dateien Mergen Java Basics - Anfänger-Themen 14
A Input/Output Mehrere Csv-Dateien einlesen Java Basics - Anfänger-Themen 2
LetsSebi Dateien werden nicht in Zip gespeichert Java Basics - Anfänger-Themen 1
J Alle .java Dateien von einem Verzeichnis in eine Zip speichern Java Basics - Anfänger-Themen 2
J Alle Dateien aus einem Verzeichnis laden Java Basics - Anfänger-Themen 10
MiMa log4j als separate Dateien in Schleife? Java Basics - Anfänger-Themen 6
M Scannen von *.txt - Dateien; wo sind der oder die Fehler? Java Basics - Anfänger-Themen 4
A Input/Output Dateien einlesen und ausgeben Java Basics - Anfänger-Themen 7
S Lese- / Schreibfähigkeit von Dateien sicherstellen Java Basics - Anfänger-Themen 1
C "HelloWorld" - Dateien erstellt, aber ist es eine class-Datei? Java Basics - Anfänger-Themen 2
J Java findet plötzlich die Dateien im Projekt nicht mehr. Java Basics - Anfänger-Themen 12
J Dateien in Verzeichnissen rekursiv auflisten wirft Exception Java Basics - Anfänger-Themen 4
L Classpath Alle Dateien im Classpath finden Java Basics - Anfänger-Themen 4
MiMa Formate für Dateien und Pfade? Java Basics - Anfänger-Themen 1
O Datei in mehrere kleine Dateien umwandeln Java Basics - Anfänger-Themen 47
L Richtige Reihenfolge der Dateien Java Basics - Anfänger-Themen 5
CptK Datentypen Text Dateien einlesen Java Basics - Anfänger-Themen 3
J Logging erzeugt zwei dateien.... Java Basics - Anfänger-Themen 7
A Dateien Verschieben Java Basics - Anfänger-Themen 1
M Mehre Dateien parallel kopieren mit Multithreading Java Basics - Anfänger-Themen 8
C Methoden Dateien im Ordner anzeigen Java Basics - Anfänger-Themen 12
J Java-Dateien lassen sich nicht editieren Java Basics - Anfänger-Themen 46
E FTP Dateien hochladen Java Basics - Anfänger-Themen 3
J Probleme beim schreiben von Dateien Java Basics - Anfänger-Themen 5
Korvinus Vergleichen von 2 csv-Dateien Java Basics - Anfänger-Themen 2
I Texte mit Absätzen in Dateien speichern und auslesen Java Basics - Anfänger-Themen 1
M "substring()" mit Dateien und Pfadangaben Java Basics - Anfänger-Themen 5
Voreck Jar Dateien Standart programm ändern Java Basics - Anfänger-Themen 12
K Dateien aus Source-Package verwenden Java Basics - Anfänger-Themen 10
B Dateien aus dem "resource" - Folder kopieren in Verzeichnis Java Basics - Anfänger-Themen 9
B Kopieren von Dateien mit Adminberechtigungen Java Basics - Anfänger-Themen 14
F Threads ftp4j, viele Dateien upload Java Basics - Anfänger-Themen 5
P Einen Ordner mit Dateien hochladen [FTP] Java Basics - Anfänger-Themen 2
X Dateien direkt hintereinander schreiben, Dateiname Java Basics - Anfänger-Themen 25
G Messwerte in 2 Dateien schreiben Java Basics - Anfänger-Themen 20
C Verarbeitung von sehr großen Dateien Java Basics - Anfänger-Themen 52
V Mehrere Dateien aus JFileChooser in eine ArrayList speichern Java Basics - Anfänger-Themen 2
T Classpath Problem mit dem auslesen von Text-Dateien (Pfad) Java Basics - Anfänger-Themen 3
A attach source: Zusammenhang zwischen JAR und .class/.java Dateien? Java Basics - Anfänger-Themen 2
T .jar Datei als Ordner benutzen/ Dateien aus .jar Datei auslesen Java Basics - Anfänger-Themen 3
C Klassen Class Files nachladen (mehrer .jar Dateien) Java Basics - Anfänger-Themen 2
Bluedaishi for schleife um Dateien wieder zusammen zu fügen Java Basics - Anfänger-Themen 11
S Resourcen-Dateien im Jar-File verfügbar machen (Intellij 14) Java Basics - Anfänger-Themen 14
J Dateien für anderen User "mitgeben" Java Basics - Anfänger-Themen 1
S Dateien mit Java verschieben Java Basics - Anfänger-Themen 6
A Heap Space Error bei rekursiver Suche in Dateien trotz nur einer Zeile im Speicher Java Basics - Anfänger-Themen 26
E Dateien werden nicht gelöscht Java Basics - Anfänger-Themen 10
S Class Dateien decompilieren Java Basics - Anfänger-Themen 4
T Fehler beim Schreiben in Dateien! Java Basics - Anfänger-Themen 4
Bluedaishi Dateien Lassen sich unter windows nicht löschen Java Basics - Anfänger-Themen 8
Z Mehrere XML-Dateien zu einer zusammenfügen Java Basics - Anfänger-Themen 3
K JAR Dateien einbinden - funkt nicht wie es sollte... Java Basics - Anfänger-Themen 22
M Threads nio Dateien kopieren, Threads und Gui Java Basics - Anfänger-Themen 0
J *.sql Dateien in Java Java Basics - Anfänger-Themen 1
P Dateien im Ordner auflisten. Java Basics - Anfänger-Themen 3
P Compiler-Fehler .java Dateien kompilieren und .class Dateien zur .jar Java Basics - Anfänger-Themen 4
S Daten aus anderen Dateien in neue Datei einlesen Java Basics - Anfänger-Themen 3
M Input/Output Arbeiten mit extrem vielen Dateien Java Basics - Anfänger-Themen 8
R File chooser Dateien in frame anzeigen lassen Java Basics - Anfänger-Themen 5
N tar-Dateien Java Basics - Anfänger-Themen 6
B Methoden Dateien konvertieren Java Basics - Anfänger-Themen 3
L Dateien speichern/auslesen Java Basics - Anfänger-Themen 5
M Input/Output Probleme beim Parsen von CSV und TXT Dateien Java Basics - Anfänger-Themen 7
P Wiedereinstieg und kann keine Dateien mehr öffnen... Java Basics - Anfänger-Themen 13
F Classpath Dateien einbinden und Classpath durchsuchen Java Basics - Anfänger-Themen 2
N Java Programm zum Suchen und Ersetzen von Text Dateien Java Basics - Anfänger-Themen 10
S Dateien/LinkedList/StringBuffer - SOrtierung klappt nicht so ganz Java Basics - Anfänger-Themen 2
U Best Practice Nicht-permanente Links auf Dateien Java Basics - Anfänger-Themen 5
B In welchem (Default) Pfad erstellt Java Dateien? Java Basics - Anfänger-Themen 4
B .ut dateien ignorieren und fortsetzen Java Basics - Anfänger-Themen 9
R Ressourcen in JAR-Dateien Java Basics - Anfänger-Themen 2
J jar Dateien global erreichbar machen Java Basics - Anfänger-Themen 3
L Zusammenführen mehrerer .txt Dateien Java Basics - Anfänger-Themen 4
S Dateien in RAM kopieren und ausführen? Java Basics - Anfänger-Themen 4
O Java Dateien verschlüsseln? Java Basics - Anfänger-Themen 22
K Unterschied zwischen Jar, war und ear Dateien Java Basics - Anfänger-Themen 3
B Dateien kopieren, entpacken, XML auslesen! Java Basics - Anfänger-Themen 7
B Dateien Verschieben! Java Basics - Anfänger-Themen 8

Ähnliche Java Themen

Neue Themen


Oben