Anzeige:
Ergebnis 1 bis 3 von 3

Thema: Bitte diesen Code beurteilen

  1. #1
    Registrierter Benutzer Avatar von Rebell
    Registriert seit
    10.07.2002
    Ort
    Dresden
    Beiträge
    62

    Bitte diesen Code beurteilen

    Es soll später mal ein Programm zur Indexierung werden. Dazu habe ich ein Skript geschrieben was Datei- und Verzeichnisnamen nach Doppelungen prüft. Aber das sog. "Optimizing" dauert extrem lange. Bei 11060 Dateien ca. 1 Minute.

    Prüft es selbst und sagt mir ob man es optimieren kann.

    Code:
    #!/usr/bin/perl
    
    $dir = $ARGV[0];
    
    if (!$dir || $dir eq ".") {
    	$dir = ".";
    	$pwd = `pwd`;
    	chomp $pwd;
    	@output = split(/\//,$pwd);
    	for $object (@output) {
    		$object =~ s/\n//g;
    		$object =~ s/\///g;
    		AddDir ($object) if($object);
    	}
    }
    $command = "ls -ARmQ $dir";
    open DIR, "$command |";
    while (<DIR>) {
    	@output = split(/, /,$_) if ($_);
    	CheckOutput (@output);
    	#print @output, "\n";
    }
    #print @output;
    sub CheckOutput {
    	my @output = @_;
    	for $object (@output) {
    		# print "original $object\n";
    		$object =~ s/\"//g;
    		$object =~ s/\n//g;
    		if ($object =~ /\:$/) {
    			$object =~ s/\:$//g;
    			$currentdir = $object;
    			$currentdir =~ s/^\.//;
    			$currentdir =~ s/^\///;
    			if ($currentdir) {
    				$currentdir = $pwd . "/" . $currentdir;
    			} else {
    				$currentdir = $pwd;
    			}
    			#print "scanning $currentdir\n";
    			next;
    		} else {
    			if ($object) {
    				$done = $currentdir ."/". $object ;
    			} else {
    				next;
    			}
    		}
    		#print "testing \"$object\" ";
    		if (-d $done) {
    		#	print "1\n";
    			# Prüft, ob sich das Verzeichnis bereits in der Liste befindet
    			#$dir_id = TestDir ($object);
    			#if ($dir_id < 1) {
    				# Wenn nicht, wird es hinzugefügt und mit einer Nummer versehen
    				$dir_id = AddDir ($object);
    			#}
    		} elsif ($object) {
    		#	print "0\n";
    			#$file_id = TestFile ($object);
    			#if ($file_id < 1) {
    				# Wenn nicht, wird es hinzugefügt und mit einer Nummer versehen
    				$file_id = AddFile ($object);
    			#}
    		}
    	}
    }
    #print "dirs: @directories \n";
    #print "files: @files \n";
    $totals_dir = $#directories + 1;
    $totals_file = $#files + 1;
    print "I have found $totals_dir directories and $totals_file files.\n";
    
    print "optimizing...\n";
    Optimizing();
    $totals_diff_dir = $#diff_directories + 1;
    $totals_diff_file = $#diff_files + 1;
    print "There are $totals_diff_dir different named directories and $totals_diff_file files.\n";
    
    sub Optimizing {
    	for $dir (@directories) {
    		if (TestDir($dir) < 1) {
    			push @diff_directories, $dir;
    		}
    	}
    	for $file (@files) {
    		if (TestFile($file) < 1) {
    			push @diff_files, $file;
    		}
    	}
    }
    
    sub TestDir {
    	my ($dir) = @_;
    	my $value = 0;
    	for ($s = 0; $s < $#diff_directories; $s++) {
    		if ($dir eq $diff_directories[$s]) {
    			$value = $s;
    			next;
    		}
    	}
    	return $value;
    }
    
    sub AddDir {
    	my ($dir) = @_;
    	push @directories, $dir;
    	return $#directories;
    }
    
    sub TestFile {
    	my ($file) = @_;
    	my $value = 0;
    	for ($s = 0; $s < $#diff_files; $s++) {
    		if ($file eq $diff_files[$s]) {
    			$value = $s;
    			next;
    		}
    	}
    	return $value;
    }
    
    sub AddFile {
    	my ($file) = @_;
    	push @files, $file;
    	return $#files;
    }
    to be famous is so nice
    http://get-mike.de
    M:ke

  2. #2
    Registrierter Benutzer
    Registriert seit
    28.08.2002
    Beiträge
    496
    also dass des bei 11000 dateien 1 minute dauern kann kann ich mir scho vorstellen, ist doch keine schlechte zeit, wenn du bedenken muss, dass du pro lese/schreib operation auf der festplatte 8ms brauchst... 8ms * 11000 = 88s kommtdoch gut hin *gG* dazu kommt noch, dass du ja PRO FOR noch mal eine FOR hast über "if (TestDir($dir) < 1)"

    wenn du des nicht kleiner machen kannst, dann wirds wohl auch nicht schneller laufen...


    mfg

  3. #3
    Registrierter Benutzer Avatar von Rebell
    Registriert seit
    10.07.2002
    Ort
    Dresden
    Beiträge
    62
    Ich wollte ja wissen, ob es einen intelligenteren Code gibt und ob ich es optimieren könnte...
    to be famous is so nice
    http://get-mike.de
    M:ke

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •