Hallo zusammen,
bin neu hier im Forum und hoffe auf eure fachkundige Hilfe
Ich will mit einem Java Programm aufgrund unterschiedlicher Kriterien Dateien Löschen. Das Problem ist, dass sich dabei nicht um ein paar wenige Dateien handelt, sondern um viele Millionen (ca. 30 Millionen). Der Löschvorgang ist auch keine Einmalaktion, sondern wird kontinuierlich benötigt.
Ich habe dazu auch schon eine deleteTree() Methode geschrieben, die soweit funktioniert. Wenn in einem Ordner allerdings z.B. 500.000 Dateien liegen, bricht das Programm mit der Fehlermeldung: "java.lang.outOfMemoryError" ab. Den JVM Speicher habe ich auf dem Standard Wert belassen. Nun könnte ich diesen zwar erhöhen, jedoch weiß ich nicht wieviele Dateien sich maximal in einem Ordner befinden können. Daher ist das spekulativ.
Der Methode gebe ich einen Root-Pfad mit. Dieser wird dann rekursiv durchsucht (auch Unterverzeichnisse). Leere Verzeichnisse werden gelöscht. Um die Abbruchbedingung für die Schleife zu definieren sage ich, dass er abbrechen soll wenn keine Dateien mehr im Verzeichnis sind: path.listFiles(). So bis 100.000 und vielleicht auch mehr ist das kein Problem. Aber bei 500.000 gibt den Abbruch.
In der Methode werden Dateien die älter als ein definiertes Datum sind gelöscht.
Hat zu dem Thema vielleicht jemand schon Erfahrungen oder Anregungen? Freu mich über jeden Hinweis!!
Hier der Code der deleteTree() Methode:
Ich hoff ihr könnt mir helfen.
Viele Grüße
Timo
bin neu hier im Forum und hoffe auf eure fachkundige Hilfe
Ich will mit einem Java Programm aufgrund unterschiedlicher Kriterien Dateien Löschen. Das Problem ist, dass sich dabei nicht um ein paar wenige Dateien handelt, sondern um viele Millionen (ca. 30 Millionen). Der Löschvorgang ist auch keine Einmalaktion, sondern wird kontinuierlich benötigt.
Ich habe dazu auch schon eine deleteTree() Methode geschrieben, die soweit funktioniert. Wenn in einem Ordner allerdings z.B. 500.000 Dateien liegen, bricht das Programm mit der Fehlermeldung: "java.lang.outOfMemoryError" ab. Den JVM Speicher habe ich auf dem Standard Wert belassen. Nun könnte ich diesen zwar erhöhen, jedoch weiß ich nicht wieviele Dateien sich maximal in einem Ordner befinden können. Daher ist das spekulativ.
Der Methode gebe ich einen Root-Pfad mit. Dieser wird dann rekursiv durchsucht (auch Unterverzeichnisse). Leere Verzeichnisse werden gelöscht. Um die Abbruchbedingung für die Schleife zu definieren sage ich, dass er abbrechen soll wenn keine Dateien mehr im Verzeichnis sind: path.listFiles(). So bis 100.000 und vielleicht auch mehr ist das kein Problem. Aber bei 500.000 gibt den Abbruch.
In der Methode werden Dateien die älter als ein definiertes Datum sind gelöscht.
Hat zu dem Thema vielleicht jemand schon Erfahrungen oder Anregungen? Freu mich über jeden Hinweis!!
Hier der Code der deleteTree() Methode:
Code:
//-----------------------------------------------------------------------------------
//Methode zum Löschen
public void deleteTree(File path) {
Calendar myCal = new GregorianCalendar();
myCal.add(Calendar.DAY_OF_MONTH, daysBefore);
Date delBeforeDate = myCal.getTime();
Date fileDate = new GregorianCalendar().getTime();
for ( File file : path.listFiles() )
{
fileDate.setTime(file.lastModified());
if ( file.isDirectory() ){
deleteTree(file);
}
else if (fileDate.before(delBeforeDate)){
if (file.delete() == true){
file.delete();
filesDeleted++;
delLogger.info("Datei gelöscht: " + file.getPath());
errInfoLogger.info("Freier JVM Speicher: " + rt.freeMemory());
}
else{
corruptDelLogger.info("Fehler beim Löschen: " + file.getPath());
errInfoLogger.info("Freier JVM Speicher: " + rt.freeMemory());
}
}
else {
notDelLogger.info("Datei jünger als vorgegebenes Datum: " + file.getPath());
errInfoLogger.info("Freier JVM Speicher: " + rt.freeMemory());
}
}//Ende for Schleife
//Leere Ordner löschen
if(path.list().length == 0){
if (path.delete() == true){
path.delete();
foldersDeleted++;
delFolderLogger.info("Ordner gelöscht: " + path.getPath());
errInfoLogger.info("Freier JVM Speicher: " + rt.freeMemory());
}
else{
corruptDelLogger.info("Fehler beim Löschen: " + path.getPath());
errInfoLogger.info("Freier JVM Speicher: " + rt.freeMemory());
}
}
else{
notDelLogger.info("Ordner ist nicht leer: " + path.getPath());
errInfoLogger.info("Freier JVM Speicher: " + rt.freeMemory());
}
}//Ende DeleteTree()
//-----------------------------------------------------------------------------------
Ich hoff ihr könnt mir helfen.
Viele Grüße
Timo