Portál AbcLinuxu, 23. dubna 2024 15:13


Dotaz: Co je shnilého na operátoru rozsahu v Perlu ?

15.12.2006 22:36 amnesiac
Co je shnilého na operátoru rozsahu v Perlu ?
Přečteno: 92×
Odpovědět | Admin
V jednom programu potřebuju uložit pole do hashe, kde klíče v hashi jsou poziční indexy a hodnoty pak hodnoty z pole. Problém nastává u rozsáhlých polí. Následující triviální kód posílá systém do kolen, resp. swapuje i při 512MB volný paměti, což se mi zdá hodně nepřiměřený.

@indexy = ( 1 .. 10e6 )

Ekvivalent v Pythonu přitom proběhne bez swapování a za zlomek času. A to nepoužívám fci xrange.

indexy = range(1, 10e6)

Pro úplnost ta konstrukce z programu

# pole @primes obsahuje cca 5 mil. celočíselných hodnot
@hash{ (1 .. $#primes + 1) } = @primes

Perl v5.8.8

Je ta ukrutná spotřeba paměti bug ? Lze to obejít bez použití cyklu ?

Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

15.12.2006 23:54 b0rmann | skóre: 15 | Pardubice
Rozbalit Rozbalit vše Re: Co je shnilého na operátoru rozsahu v Perlu ?
Odpovědět | | Sbalit | Link | Blokovat | Admin
A co tak?

%hash=map {++$i=>$_} @primes;
--- Gott strafe Amerika
16.12.2006 10:16 Hynek (Pichi) Vychodil | skóre: 43 | blog: Pichi | Brno
Rozbalit Rozbalit vše Re: Co je shnilého na operátoru rozsahu v Perlu ?
Odpovědět | | Sbalit | Link | Blokovat | Admin
Na každý skalár v perlu se alokuje něco kolem 40byte + nějaké ta režije pole a jste na 44byte na prvek v desetimiliónprvkovém poli.
 1528 hynek      9   0  613m 449m 142m S  0.0 89.3   0:11.86 perl
Narozdíl od pythonu to opravdu není nijak optimalizované. Na efektivní práci s takovými strukturami jsou vec, případně Int::BigVec a pod. Stejně mi ale uniká, proč to děláte. Rychlost přístupu $hash{$cislo} není lepší než $primes[$cislo]. Pochopil bych opačný postup @hash{@primes} = (); a test typu $isPrime = exists $hash{$cislo};
XML je zbytečný, pomalý, nešikovný balast, znovu vynalézané kolo a ještě ke všemu šišaté, těžké a kýčovitě pomalované.
16.12.2006 10:17 Hynek (Pichi) Vychodil | skóre: 43 | blog: Pichi | Brno
Rozbalit Rozbalit vše Re: Co je shnilého na operátoru rozsahu v Perlu ?
s/Int::BigVec/Int::BitVec/
XML je zbytečný, pomalý, nešikovný balast, znovu vynalézané kolo a ještě ke všemu šišaté, těžké a kýčovitě pomalované.
16.12.2006 11:26 amnesiac
Rozbalit Rozbalit vše Re: Co je shnilého na operátoru rozsahu v Perlu ?
Díky moc.

Co mi ale není furt jasný, že následující konstrukce s multiplikátorem má spotřebu paměti daleko menší ?! Proto jsem viděl problém v operátoru .. .

perl -lwe '@indexy = (10e6) x 10e6; print $pole[10e6-1]'

a výstup ps těsně před skončením

ps -o pid,cmd,size,rss,vsz -C perl
  PID CMD                            SZ   RSS    VSZ
20215 perl -lwe @pole = (10e6) x  299332 273532 303976
16.12.2006 11:34 amnesiac
Rozbalit Rozbalit vše Re: Co je shnilého na operátoru rozsahu v Perlu ?
Grrr. Samozřejmě mělo být:

perl -lwe '@indexy = (10e6) x 10e6; print $indexy[10e6-1]'

a

ps -o pid,cmd,size,rss,vsz -C perl
  PID CMD                            SZ   RSS    VSZ
20215 perl -lwe @indexy = (10e6) x  299332 273532 303976

Sorry.

16.12.2006 12:34 amnesiac
Rozbalit Rozbalit vše Re: Co je shnilého na operátoru rozsahu v Perlu ?
Ještě varianta přes cyklus:

perl -le 'for ($i=1; $i <= 10e6; $i++) { push @pole,$i; } print $pole[10e6-1]'

ps -o pid,cmd,size,rss,vsz -C perl
  PID CMD                            SZ   RSS    VSZ
24054 perl -le for ($i=1; $i <= 10 234804 235548 239448

Taky vezme výrazně míň paměti.

16.12.2006 16:46 Hynek (Pichi) Vychodil | skóre: 43 | blog: Pichi | Brno
Rozbalit Rozbalit vše Re: Co je shnilého na operátoru rozsahu v Perlu ?
Takže problém bude asi, že to pole se vytvoří vlastně dvakrát, jednou ho udělá operátor .. a pak se ještě skopíruje do cílového pole. Při plnění do hashe to udělá dokonce čtyřikrát. Asi bude nejlepší, když to prostě nebudete dělat. On si naalokuje tu paměť a potom ji neuvolní. Myslím tím do systému, pro perl je samozřejmě volná. Jinak, když dělám podobné testy, tak používám oneliner typu
perl -le '@hash{1..5e6} = (1..5e6); print "Hotovo"; sleep'
Nemusíte to potom nijak odchytávat :-)
XML je zbytečný, pomalý, nešikovný balast, znovu vynalézané kolo a ještě ke všemu šišaté, těžké a kýčovitě pomalované.
16.12.2006 14:20 Petr Zelenka | skóre: 24 | Semice/Stuttgart (Sindelfingen)
Rozbalit Rozbalit vše Re: Co je shnilého na operátoru rozsahu v Perlu ?
Odpovědět | | Sbalit | Link | Blokovat | Admin
V jednom programu potřebuju uložit pole do hashe, kde klíče v hashi jsou poziční indexy a hodnoty pak hodnoty z pole.

Jestli tomu správně rozumím, tak chcete nahradit konstrukci typu pole[index] konstrukcí hash[klíč]. Můžu se zeptat proč? V čem je pro vás hash lepší? Beztak budete tou hashí jen suplovat funkčnost pole, nebo se pletu?

A teď si uvědomte, jaký je vztah mezi krychlí a motýlem.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.