Rekursion Dauer

eQuest

Mitglied
Hi Community,
bastel grad an einem Programm und verwende ich auch rekursive Aufrufe für Verzeichnisoperationen. Dazu habe ich auch eine GUI auf der eine ProgressBar läuft, welche den Fortschritt wiedergeben soll. Nun hat sich mir die Frage gestellt, wie ich denn abschätzen kann, wie lang so ein rekursiver Aufruf dauert.
Eigentlich geht das doch garnicht oder? Denn ich müsste im Vorhinein schon wissen, wie viele Dateien ich ingesamt kopieren will, um einen Fortschritt feststellen zu können (also immer, wenn ein Hunderstel von den gesamten Dateien kopiert wurde, progressBar.setValue(++j)). Aber das ist ja bei einer rekursiven Methode nicht der Fall, weil man ja nie weiß, wie sich das entwickelt, wie groß der "Baum" wird.

Mal anhand dieses Beispieles:
Java:
private int listdir(File dir){
		
		File[] files = dir.listFiles();
		for(int i=0;i<files.length;i++){
			if(files[i].isDirectory()){
				listdir(files[i]);
			}
			else{
				System.out.println(files[i].getName());
			}
		}
		
		return 0;
	}

Habt ihr irgendwelche Ideen?
 

Marco13

Top Contributor
Abgesehen von dieser Methode wüßte ich da auch nichts konkretes. Ein Mittelding könnte sein, die Rekursion erstmal so durchlaufen zu lassen (mit indeterminate=true) und NUR die Dateien zu zählen. Danach die Rekursion nochmal laufen lassen und die eigentlichen Operationen durchführen, für die man dann eine grobe Schätzung auf Basis der vorherigen Zählung abgeben kann. Sehr grob: Wenn alle Dateien 1 byte groß sind, und die Letzte 10 GB, wird er eine Weile bei 99% stehen bleiben (evtl. könnte man dann statt der Anzahl der Dateien eben die verarbeitete Größe verwenden, aber das muss man sich überlegen)
 

ice-breaker

Top Contributor
da du eine rekursive Methode hast, die pro Rekursion Arbeit erzeugt gibt es da keine simple Möglichkeit.

Wenn du möglicherweise schon die Größe des Ordners/Laufwerks kennt, könnte man folgendes machen:
Java:
private int listdir(File dir, long realSize, MutableLong computedSize){
		
		File[] files = dir.listFiles();
		for(int i=0;i<files.length;i++){
			if(files[i].isDirectory()){
				listdir(files[i], realSize, computedSize);
			}
			else{
				System.out.println(files[i].getName());
				long size = computedSize.addAndGet(files[i].length());
				// update status: size * 100 / realSize
			}
		}
		
		return 0;
	}

Das ist in etwa auch die Art wie Virenscanner den Fortschritt messen, habe ich mal ausprobiert indem ich die Festplatte während des Scannens mit großen Dateien gefüllt habe.
 
Zuletzt bearbeitet:
T

tuxedo

Gast
Auf iteration umbauen und vorher mal durchzählen wieviel durchläufe man in der iterativen schleife braucht. Dann weißt du wieviel zu tun ist ..
Wenn es allerdings nur drum geht den Speicherplatzbedarf aufzusummieren, macht das wenig Sinn.

Dennoch würd' ichs Iterativ machen, wohl mit nem Stack oder so:

Pseudocode:

Code:
addToStack(dir)

while (!stack.empty){

   file f = stack.pop()
   if (f.isDirectory()) {stack.push(f)}

   process(f)

}

- Alex
 
J

JohannisderKaeufer

Gast
Java:
//float mit 1.0
private int listdir(File dir, float factor){
		
		File[] files = dir.listFiles();
                float part = factor / files.length;
		for(int i=0;i<files.length;i++){
			if(files[i].isDirectory()){
				listdir(files[i], part);
			}
			else{
				System.out.println(files[i].getName());
                                addAnotherPartToProcessbar(part);
			}
                        
		}
		
		return 0;
	}

Hier gehe ich davon aus das jedes Element in einem Verzeichnis den gleichen Arbeitsaufwand benötigt.
Bspl
Code:
vz 1
  F11
  F12
F 2
F 3

Es gibt 1 Verzeichnis und 2 Dateien.
vz1 hat einen Anteil von 1/3,F2 1/3 F3 1/3.
F11 und F12 die in Vz1 liegen bekommen den factor 1/3 mit woraus sich jeweils 1/6 errechnet.

Also
Code:
F11 -> 1/6
F12 -> 1/3
F2   -> 2/3
F3   -> 1

liegen in vz1 hunderte von Dateien sieht das Ergebnis allerdings nicht ganz so harmonisch aus.
 

mohrenkopf

Mitglied
Du schreibst von "Verzeichnisoperationen". Ist das Ausgeben/Bestimmen schon die eigentliche Verzeichnisoperation oder willst du mit den Dateien auch noch etwas anderes anstellen (Kopieren, Einlesen)?

Im ersten Fall hast du wahrscheinlich eher verloren, stell dir auf oberster Ebene 100 Verzeichnisse vor, von denen das letzte massig Unterverzeichnisse etc enthält, aus "oberster" Sicht allerdings nur 1% ausmacht. Egal ob Breitensuche oder Tiefensuche, die Überraschung kann überall lauern...

Falls du die Dateien z.B. noch analysieren willst, kannst du ja zuerst per Rekursion eine Liste mit allen abzuarbeitenden Dateien erstellen und bei der Gelegenheit schon mal die Dateigröße etc merken/zählen. Die eigentliche Verarbeitung machst du dann anhand der Liste.
 

eQuest

Mitglied
Danke für die zahlreichen Hilfestellungen!
Habe nun die Lösung von ice-breaker umgesetzt und funktioniert super, danke :)

@mohrenkopf: Will kopieren ;)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
P Rekursion Aufrufbaum Allgemeine Java-Themen 7
N rekursion mehrfach eine Methode Öffnen Allgemeine Java-Themen 4
districon Rekursion und Dynamische Programmierung Allgemeine Java-Themen 2
Zeppi Rekursion StackOverflowError Allgemeine Java-Themen 4
J Rekursion Allgemeine Java-Themen 4
Zrebna Wie kann man endgültig aus einer Rekursion ausbrechen? Allgemeine Java-Themen 14
parrot Rekursion Aufgabe Allgemeine Java-Themen 12
B Rekursion Allgemeine Java-Themen 11
X Wie mache ich hier eine Rekursion rein ? Allgemeine Java-Themen 7
J Rekursion Mergesort Allgemeine Java-Themen 10
R Rekursion Allgemeine Java-Themen 3
R Programm zur Rekursion Allgemeine Java-Themen 5
V Rekursion Allgemeine Java-Themen 2
J Denkfehler Rekursion Allgemeine Java-Themen 5
I Raute mit Rekursion "zeichnen" Allgemeine Java-Themen 7
B Rekursion Allgemeine Java-Themen 2
B Rekursion Allgemeine Java-Themen 22
B Java Sternchen ausgeben mittels Rekursion Allgemeine Java-Themen 3
Hacer Rekursion- sumOfAllNodes Allgemeine Java-Themen 5
L Rekursion Binärbaum Allgemeine Java-Themen 7
Androbin Interpreter-Fehler Probleme mit Rekursion - StackOverflowError Allgemeine Java-Themen 8
Y Rekursion Allgemeine Java-Themen 19
M Permutation ohne Wiederholung mit rekursion Allgemeine Java-Themen 4
J Rekursion oder Iteration - verkettete Listen Allgemeine Java-Themen 8
T Pascalsches Dreieck ohne array und rekursion Allgemeine Java-Themen 9
P Rekursion Allgemeine Java-Themen 9
R Threading und Rekursion führen zu “GC overhead limit exceeded” Allgemeine Java-Themen 4
W Rekursion-Probleme mit return Allgemeine Java-Themen 35
C Rekursion Fibonacci Allgemeine Java-Themen 31
T Rekursion mit While Schleife kombinieren? Allgemeine Java-Themen 4
Weiti Swingworker und Rekursion Allgemeine Java-Themen 8
L fragwürdige Rekursion Allgemeine Java-Themen 4
L Kleine Rekursion Allgemeine Java-Themen 12
M Rekursion!! Allgemeine Java-Themen 8
J Rekursion in Schleifenkonstrukt wandeln Allgemeine Java-Themen 21
R Rekursion Ablauflogik Allgemeine Java-Themen 19
M Rückwärts geführte Rekursion Allgemeine Java-Themen 3
Schandro StackOverflowError bei Rekursion verhindern Allgemeine Java-Themen 14
G Werte bei Rekursion viel höher als erwartet Allgemeine Java-Themen 3
G Rekursion - Denksport Allgemeine Java-Themen 6
S Rekursion und StackOverflow Allgemeine Java-Themen 11
P Stackoverflow in Rekursion. Bin ich schuld oder Java? Allgemeine Java-Themen 9
W kompliziertes Konstrukt von Schleifen/If/else. Rekursion? Allgemeine Java-Themen 22
S Rekursion Allgemeine Java-Themen 2
Linad Tiefe der Rekursion als Abbruchbedingung Allgemeine Java-Themen 6
Linad Zahlensysteme -> Rekursion Allgemeine Java-Themen 4
N Frage zu einer Rekursion Allgemeine Java-Themen 4
C mp3-Lied Dauer berechnen Allgemeine Java-Themen 1
P Dauer (Tage, Stunden, Minuten, Sekunden) berechnen Allgemeine Java-Themen 5

Ähnliche Java Themen

Neue Themen


Oben