Thread Array teilen (9 answers)
Opened by rosti at 2011-07-14 17:40

MatthiasW
 2011-07-15 16:19
#150448 #150448
User since
2008-01-27
367 Artikel
BenutzerIn
[default_avatar]
2011-07-15T11:39:52 pq
2011-07-15T07:38:50 rosti
danke, jow, leider sind die Daten kurzzeitig mal doppelt im RAM,

falsch. der code nimmt von @old weg und fügt zu @new hinzu. es sind immer nur 3 elemente doppelt im speicher.

Das ist soweit schon richtig, allerdings denke ich, dass @old wohl trotzdem Platz für so viele Skalare belegt, wie an Daten vorher drin gespeichert wurden. Wie bei einem void* a[1000]: der wird auch nicht kleiner nur weil ich seine Elemente auf 0 setze.

Ob das hier aber eine Rolle spielt? Ich wage es mal zu bezweifeln. Man müsste den tatsächlichen Overhead einfach mal messen:
more (7.2kb):
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
#!/usr/bin/perl

use 5.010;
use strict;
use warnings;
use autodie;
use Devel::Size qw< total_size >;

sub size (&@) {
    my ($code, $count, $name) = @_;
    
    my @test;
    push @test, $code->($_) for 1..$count;
    
    my $full = total_size(\@test);
    splice @test, 0, @test;
    my $empty = total_size(\@test);
    
    say "\n$name\nfull: $full\nempty: $empty\nratio: ", $empty/$full;
}

size { bless {}  } 100_000, "object";
size {     1     } 100_000, "integer";
size {  3.14159  } 100_000, "number";
size {    'a'    } 100_000, "single character string";
size {'a' x    10} 100_000, "string (10)";
size {'a' x   100} 100_000, "string (100)";
size {'a' x 1_000} 100_000, "string (1_000)";

liefert:
more (1.0kb):
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
25
26
27
28
29
30
31
32
33
34
object
full: 8924308
empty: 524308
ratio: 0.0587505496224469

integer
full: 2124308
empty: 524308
ratio: 0.246813550577412

number
full: 2924308
empty: 524308
ratio: 0.179293015646779

single character string
full: 3324308
empty: 524308
ratio: 0.157719441158882

string (10)
full: 4124308
empty: 524308
ratio: 0.127126296096218

string (100)
full: 13324308
empty: 524308
ratio: 0.0393497358361875

string (1_000)
full: 103324308
empty: 524308
ratio: 0.00507439159428002

Wie man sieht, ist der Overhead in allen Fällen gleich groß und im Verhältnis zum gefüllten Array nicht zu unterschätzen, wenn auch ~0.5 MiB so gut wie nichts ist.

Wenn es denn unbedingt ohne Kopie sein soll, ersetzt man eben in dem Array selbst:
Code (perl): (dl )
1
2
$data[$_] = [@data[$_*3..$_*3+2]] for 0..$#data/3;
$#data = $#data/3; # neue Länge setzen

Das ist aber wirklich nicht schön anzuschauen.

MfG

Editiert von MatthiasW: Code zum Testen der Größe von Objekten hinzugefügt
Last edited: 2011-07-15 17:26:09 +0200 (CEST)
perl -E'*==*",s;;%ENV=~m,..$,,$&+42;e,$==f;$"++for+ab..an;@"=qw,u t,,print+chr;sub f{split}say"@{=} me"'

View full thread Array teilen