Schrift
[thread]8250[/thread]

performante Möglichkeit für grössere Datenstruktur



<< >> 8 Einträge, 1 Seite
tbase
 2006-08-20 13:44
#69045 #69045
User since
2006-07-22
1 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hallo zusammen,

ich bin dabei, ein kleines monitoring-tool in perl zu schreiben.

Es gibt eine Endlosschleife, in der die tests abgearbeitet werden. Allerdings brauche in irgendeine struktur, in der folgende Daten drinstehen, und die eben ständig wieder sehr schnell gelesen werden muss:
hostname, 2 x timestamps, textueller output und noch ca. 5 andere Werte.
Diese Werte gibt es ca. 200-300 mal (quasi Zeilen).
Auf diese Werte muss sehr oft zugegriffen werden.

Jetzt meine Frage: Was ist hierbei die Beste Möglichkeit, um diese Struktur abzubilden? Arrays?
Wenn ich ein 1-dimensionales array habe, habe ich die o.g. Felder alle zusammen als 1 String stehen, d. h. ich müsste JEDES mal wenn ich auf die Werte zugreife, diese erst matchen.

Gibt es eine geschicktere Möglichkeit? Ich würde mich über Ideen hier freuen.


Danke soweit,

tbase,
Rüdiger

uname-a
uname-a - blog
renee
 2006-08-20 13:58
#69046 #69046
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Im Prinzip ist ein Hash die beste Möglichkeit, um sehr schnell auf Daten zugreifen zu können.
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Ronnie
 2006-08-20 14:45
#69047 #69047
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Ja, wenn ich es richtig verstanden habe ist ein AoH (array of hashes) die Datenstruktur die für dich am sinnvollsten ist. Ein kleines Beispiel:
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
#!usr/bin/perl

use strict;
use warnings;

use Data::Dumper;

my $set = [];
my $record1 = {
hostname => 'box',
timestamp1 => '200412311931',
timestamp2 => '200503190712',
text => 'Hello World!',
# yada yada yada
};

my $record2 = {
hostname => 'box2',
timestamp1 => '200412311931',
timestamp2 => '200503190712',
text => 'foo bar baz',
# yada yada yada
};

push @$set, $record1;
push @$set, $record2;

print Dumper $set;

print Dumper grep { $_->{hostname} eq 'box' } @$set; # filtering records
vayu
 2006-08-20 15:31
#69048 #69048
User since
2005-01-13
782 Artikel
BenutzerIn
[default_avatar]
wieso bewahrst du die einzelnen records in nem array auf Ronnie, anstatt auch die in einen hash zu stecken?
Ronnie
 2006-08-20 15:37
#69049 #69049
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
[quote=vayu,20.08.2006, 13:31]wieso bewahrst du die einzelnen records in nem array auf Ronnie, anstatt auch die in einen hash zu stecken?[/quote]
Ich verwende ein AoH weil keine Angabe existiert ob es etwas gibt was als zentraler Schlüssel verwendet werden soll. Außerdem ist es sehr leicht ein AoH zu durchsuchen, in eine CSV-Datei zu exportieren etc.
Crian
 2006-08-21 15:58
#69050 #69050
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Ja, ich würde dafür auch ein AoH nehmen. Wenn es einen guten primären Schlüssel gibt, auch ein HoH, aber bei meinen Datenaufkommen ist idR immer ein AoH das Mittel der Wahl.
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
esskar
 2006-08-22 09:35
#69051 #69051
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
obwohl AoA noch schneller wäre

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
35
36
37
#!usr/bin/perl

use strict;
use warnings;

use Data::Dumper;

use constant {
HOSTNAME => 0,
TIMESTAMP1 => 1,
TIMESTAMP2 => 2,
TEXT => 3,
};

my $set = [];
my $record1 = [
'box',
'200412311931',
'200503190712',
'Hello World!',
# yada yada yada
];

my $record2 = [
'box2',
'200412311931',
'200503190712',
'foo bar baz',
# yada yada yada
];

push @$set, $record1;
push @$set, $record2;

print Dumper $set;

print Dumper grep { $_->[HOSTNAME] eq 'box' } @$set; # filtering records
Crian
 2006-08-22 17:04
#69052 #69052
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Schneller vielleicht, dafür mit Dokumentationsaufwand verbunden, der durch das Hash entfällt ;-)
Falls man den Geschwindigkeitsschub braucht, ist das natürlich ein guter Einwurf.
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
<< >> 8 Einträge, 1 Seite



View all threads created 2006-08-20 13:44.