Thread Suche Tie-Hash Modul um Flachen Hash in einen Baum zu wandeln
(5 answers)
Opened by topeg at 2010-10-12 17:30
Ein kurzer Bericht.
Ich den Parser umgeschrieben und konnte die Startzeit von über 10 Minuten auf ~40 Sekunden reduzieren. für alle die es interessiert: Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 sub load { my $file=shift; defined($file) or die(qq(No file defined!\n)); -f $file or die(qq(ERROR: File "$file" not defined or not exists\n)); open(my $fh, '<', $file) or die(qq(ERROR: Can't open File "$file" $!\n)); my $ret={}; my $lastkey; while(my $line=<$fh>) { chomp($line); next if($line=~/^\s*#/o || $line=~/^\s*$/o); if(my ($key,$value)=$line=~/^\s*([^=]+?)\s*=\s*(.*?)(?:#.*)?\s*$/o) { $ret->{$key}=$value // ''; $lastkey=$key; } elsif($lastkey) { $ret->{$lastkey}.="\n$line"; } } close($fh); return $ret; } sub parse { my $hash=shift; my $sep=shift // '.'; return {} unless($hash && ref($hash) eq 'HASH'); my $ret={}; KEYLOOP: for my $k (keys(%$hash)) { my $ref=\$ret; my @kk=(); for my $n (split(/\Q$sep\E/,$k)) { push(@kk,$n); $ref=\$$ref->{$n}; next KEYLOOP if($$ref && !ref($$ref)) } $$ref=$hash->{$k}; } return $ret; } Dabei ist auch die Speicherplatzerbrauch auch etwas geschrumpft (die Daten werden nicht sieben mal im Speicher gehalten.). Jetzt muss ich nur noch verhindern, das gleich alle abhängigen Dateien geladen werden. Das macht ~90 des gesamten Speicherverbrauches aus. Da werde ich wohl mit einem Tie::File Modul arbeiten. Meine Experimente mit Tie::Hash sind nicht sehr befriedigend. Das erzeugen einer Instanz ist um ein vielfaches langsamer als das direkte Parsen. Möglicherweise liegt es auch an der Art wie ich die Daten verwalte. Ich werde weiter schauen. |