Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]5477[/thread]

mehr speicher für perl (Seite 2)



<< |< 1 2 >| >> 19 Einträge, 2 Seiten
Strat
 2005-06-23 17:22
#47093 #47093
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
den groessten Wert eines hashes bekommst du schneller heraus mit
Code: (dl )
1
2
use List::Util qw(max);
my $max = max(values %hash);

da du nur den groessten Wert brauchst und keine sortierte Liste, ist die sortierung unnoetig.

um zu ueberpruefen, ob ein hashschluessel existiert, ist
Code: (dl )
unless (exists $hash{$_}) {

meistens besser, weil da gar nicht auf den wert zugegriffen werden braucht.

Aber das ist alles nur Kleinkram; eine signifikaten leistungssteigerung bekommst du wohl nur durch einen besseren algorithmus und/oder besser angepasste datenstrukturen.
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Ronnie
 2005-06-23 17:33
#47094 #47094
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Code: (dl )
1
2
3
4
5
6
7
8
9
10
#!/usr/bin/perl

use strict;
use warnings;

use Data::Dumper;

my %lut = map { "produkt".$_ , $_ } (1..50000);
my @daten = qw(produkt3 produkt21 produkt93 produkt50000);
print Dumper [map {$lut{$_}} @daten];

Die meiste Zeit vergeht beim 'bauen' des Hashs:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
$ time perl lookup_ids.pl 
$VAR1 = [
3,
21,
93,
50000
];

real 0m0.693s
user 0m0.553s
sys 0m0.061s

eine reduzierung auf 40000 Paare im hash ändert kaum etwas:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
$ time perl lookup_ids.pl 
$VAR1 = [
3,
21,
93,
40000
];

real 0m0.579s
user 0m0.451s
sys 0m0.051s

Wieviel Zeit nimmt dein Code denn in Anspruch? Wie befüllst du den Hash? Aus Textdatei, Datenbank? Das sind häufiger die Flaschenhälse.
norman
 2005-06-23 17:42
#47095 #47095
User since
2004-03-11
46 Artikel
BenutzerIn
[default_avatar]
windows oder linux ist von der perf. her egal. ich teste noch ein wenig...\n\n

<!--EDIT|norman|1119538023-->
norman
 2005-06-23 17:50
#47096 #47096
User since
2004-03-11
46 Artikel
BenutzerIn
[default_avatar]
hi ronnie,

die schlechte perf. kommt auf jeden fall durch den "lookup" im hash. (zur zeit etwa eine halbe sekunde pro lookup). ich habe messpunkte eingebaut, um die datenbank auszuschließen. bei 1000 datensätzen dauert das ewig.
die hashdaten in der datenbank nehmen ohne index nur 3.1mb ein. das ist nichts!\n\n

<!--EDIT|norman|1119538050-->
Ronnie
 2005-06-23 18:04
#47097 #47097
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Hallo norman,

das ist sehr merkwürdig. Ich habe mal 20000 lookups probiert mit folgendem Code:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
#!/usr/bin/perl

use strict;
use warnings;

use Data::Dumper;

my %lut = map { "produkt".$_ , $_ } (1..50000);
my @daten = map { "produkt".int(rand(50000)) } (1..20000);
#print Dumper [map {$lut{$_}} @daten];

Ergebnis:
Code: (dl )
1
2
3
4
5
$ time perl lookup_ids.pl 

real 0m0.750s
user 0m0.644s
sys 0m0.061s

Mit Ausgabe dauert es natürlich deutlich länger, aber selbst dann nur knapp 3 Sekunden:
Code: (dl )
1
2
3
real    0m2.815s
user 0m1.048s
sys 0m0.211s

Und das auf einem 1.42 GHz G4. Bei 50000 lookups sind es mit Ausgabe knapp 4.5 Sekunden. Sorry ich kann dein Problem leider nicht reproduzieren.

Gruß,
Ronnie
norman
 2005-06-23 18:12
#47098 #47098
User since
2004-03-11
46 Artikel
BenutzerIn
[default_avatar]
problem gefunden!

das ist wesentlich langsamer bei großen hashes:
Code: (dl )
1
2
my @key = sort { $contentsRef->{$a} <=> $contentsRef->{$b} } keys %{$contentsRef};
my $max = $contentsRef->{$key[-1]};


als

Code: (dl )
1
2
use List::Util qw(max);
my $max = max(values %{$contentsRef});


vielen dank für eure tipps!\n\n

<!--EDIT|norman|1119540352-->
Gast Gast
 2005-06-23 20:50
#47099 #47099
'türlich. Man muss ja nicht das ganze Array sortieren, um an den höchsten Wert zu kommen :D
Crian
 2005-06-27 11:20
#47100 #47100
User since
2003-08-04
5873 Artikel
ModeratorIn
[Homepage]
user image
Das hatte Strat weiter oben doch schon geschrieben ^^
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Strat
 2005-06-27 15:44
#47101 #47101
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
seltsam... das bedeutet, dass da viele neue objekte im hash angelegt werden...
Code: (dl )
 if(!defined($hash{$_})) 
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
<< |< 1 2 >| >> 19 Einträge, 2 Seiten



View all threads created 2005-06-23 14:37.