Schrift
[thread]5477[/thread]

mehr speicher für perl



<< |< 1 2 >| >> 19 Einträge, 2 Seiten
norman
 2005-06-23 14:37
#47083 #47083
User since
2004-03-11
46 Artikel
BenutzerIn
[default_avatar]
hallo!

kann man perl mehr arbeitsspeicher zuweisen, z.b. 512 ram (es läuft nicht als cgi)?

problem ist, dass ich mit einem großen hash arbeite. das system ist dabei extrem langsam. in der prozessliste wird aber nur eine ram-belegung von 40mb angezeigt.

gruß,
norman
Strat
 2005-06-23 14:57
#47084 #47084
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
du kannst dein script anweisen, mehr arbeitsspeicher zu verbrauchen, aber das duerfte dir nicht helfen, denn dein problem scheint nicht mangelnder arbeitsspeicher zu sein, sondern dass es einfach zu langsam ist (wegen cpu, hdd oder was auch immer). Der Hash braucht nur soviel RAM, wie die darin gespeicherten Daten benoetigen.

ein klein wenig koennte es helfen, wenn du den hash schon vordimensionierst (vermindert speicherfragmentierung durch mehrfaches umkopieren und beschleunigt das programm ein klein wenig):
Code: (dl )
scalar(%hash) = $anzahlDerElementeDieDerHashAufnehmenSoll;

aber um einen wirklich signifikanten geschwindigkeitszuwachs zu bekommen, reicht sowas nicht aus.\n\n

<!--EDIT|Strat|1119524270-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
norman
 2005-06-23 15:13
#47085 #47085
User since
2004-03-11
46 Artikel
BenutzerIn
[default_avatar]
hi strat!

ich hatte das thema gestern schon mal diskutiert im "allgemein"-bereich.
muss die "default"-größe des hashes genau stimmen oder kann ich von anfang an z.b. 10000 nehmen?

interessant ist, dass der hast bis ca. 45000 einträge sehr schnell ist und dann extrem langsam wird. als wenn eine interne grenze überschritten wird...
hast du ne idee für eine andere strategie, als hash? vielleicht ein grep auf einen array?

gruß,
norman
GwenDragon
 2005-06-23 15:25
#47086 #47086
User since
2005-01-17
14608 Artikel
Admin1
[Homepage]
user image
Wenn Speicher fehlt, wird auf Festplatte ausgelagert, das bestimmt das Betriebssystem und nicht Perl.
Strat
 2005-06-23 15:44
#47087 #47087
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
je genauer die groesse, desto besser; aber genau bis aufs letzte bekommt man's eh nur selten hin; in etwa reicht also (fuer Laufzeitgewinn besser 100 mehr als weniger).

Je genauer du erklaerst, was du machst, damit das problem auftritt, um was es sich handelt usw., desto konkreter kann dir vermutlich geholfen werden. Ich kann mit den wenigen Infos, die ich in den beiden threads bekommen habe, nur spekulieren, was vermutlich sowohl dich als auch mich nur unnoetig zeit kostet...
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Ronnie
 2005-06-23 15:52
#47088 #47088
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Am einfachsten wäre du würdest uns den problematischen code zeigen, das erspart wildes spekulieren. Ansonsten könnte dir auch Devel::DProf helfen Bottlenecks zu finden. Schau dir mal diesen Artikel an: http://www.herlpacker.co.uk/article....ce.html
norman
 2005-06-23 16:16
#47089 #47089
User since
2004-03-11
46 Artikel
BenutzerIn
[default_avatar]
habe gerade mal mit "top" geguckt: geswapped wird nicht. der prozess hat 43ram und 100% cpu.

so solls laufen (wie gesagt: bis ca. 45000 einträge im hash gehts schnell, danach extrem langsam):

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# produkt_name => produkt_id
my %hash = (
 'produkt1' => 1,
 'produkt2' => 2,
 'produkt3' => 3,
 ...,
 'produkt50000' => 50000
);

my @daten = ('produkt3','produkt4','produkt3','produkt50000',...);

# ids für die elemente im datenarray holen
my @data_ids;
for my $i (0..$#daten) {  
push(@data_ids,$hash{$daten[$i]});
}

# ausgabe in datenbank von @data_ids
...
\n\n

<!--EDIT|norman|1119529175-->
Strat
 2005-06-23 16:28
#47090 #47090
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
und was passiert bei
Code: (dl )
1
2
3
4
5
6
7
8
my %hash;
scalar(%hash) = 50_000;
%hash = ('produkt1' => 1, .... 'produkt50000' => 50000);
my @daten = (...);
my @data_ids; $#data_ids = $#daten;
foreach (@daten) {
push (@data_ids, $hash{$_});
} # foreach
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Ronnie
 2005-06-23 16:42
#47091 #47091
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Code: (dl )
@data_ids = map {$hash{$_}} @daten;

sollte es auch tun.
norman
 2005-06-23 17:02
#47092 #47092
User since
2004-03-11
46 Artikel
BenutzerIn
[default_avatar]
Code: (dl )
scalar(%hash) = 50000;
bringt eine fehlermeldung, ich habs mit
Code: (dl )
keys %content_hash = 50000;
versucht. die performance bleibt aber die gleiche.

hatte noch eine schleife vergessen, die aber relativ selten genutzt wird, weil selten neue produkte dazu kommen.

Code: (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
# produkt_name => produkt_id
my %hash;
keys %content_hash = 50000;

%hash = (
'produkt1' => 1,
'produkt2' => 2,
'produkt3' => 3,
'produkt50000' => 50000
);

my @daten = ('produkt3','produkt2','produkt3','produkt50000');

# ids für die elemente im datenarray holen
my @data_ids; $#data_ids = $#daten;
foreach (@daten) {
     
 if(!defined($hash{$_})) { # wenn neues produkt, z.b. produkt50001, neues wertepaar im hash
   my @key = sort { $hash{$a} <=> $hash{$b} } keys %hash; # ordnen
   $hash{$_} = $hash{$key[-1]} + 1; # maximum + 1
 }
 push (@data_ids, $hash{$_});

} # foreach
\n\n

<!--EDIT|norman|1119532029-->
<< |< 1 2 >| >> 19 Einträge, 2 Seiten



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