Storable: Zugriffsperformance auf Struktur nach retrieve

17/12/2008 - 17:32 von mh | Report spam
Hallo *,

ich verwende store/retrieve aus dem Storable Modul, um eine ca. 3 MB
grosse, ziemlich komplexe Struktur zu speichern und wieder zu laden.
Dabei habe ich festgestellt, dass die Struktur nach dem retrieve zwar
wieder vollstaendig verfuegbar zu sein scheint, dass aber alle Zugriffe
darauf um ein Vielfaches (ca. Faktor 8 bis 10) langsamer sind als auf
die Original-Struktur vor dem Store.
Kann das sein? Und wenn ja, kann man da etwas verbessern? Oder kann es
sein, dass ich einen generellen (Denk-)fehler habe?

<Zugriffe auf %str schnell>
...
store( \%str, $sFile );
...
undef( %str );
%str = %{ retrieve( $sFile ) };
...
<Zugriffe auf %str langsam>

Danke und ciao.
Michael.
Michael Hirmke
 

Lesen sie die antworten

#1 Moritz Lenz
17/12/2008 - 18:49 | Warnen spam
Hallo,

Michael Hirmke wrote:
ich verwende store/retrieve aus dem Storable Modul, um eine ca. 3 MB
grosse, ziemlich komplexe Struktur zu speichern und wieder zu laden.
Dabei habe ich festgestellt, dass die Struktur nach dem retrieve zwar
wieder vollstaendig verfuegbar zu sein scheint, dass aber alle Zugriffe
darauf um ein Vielfaches (ca. Faktor 8 bis 10) langsamer sind als auf
die Original-Struktur vor dem Store.
Kann das sein?



Könnte sein, wenn vorher das Memory-Layout so viel besser war, dass alle
Zugriffe aus dem Cache erfolgten, und nachher alles einzeln zurückgeholt
werden kann. Aber dass es so extrem ist, ist schon sehr ungewöhnlich.

Hast du mal ein Beispiel für so eine Datenstruktur, sodass wir das
nachvollziehen können? (ich würde das gerne auch auf verschiedenen
Perl-Versionen testen).

Wie hast du denn die Zugriffszeiten ermittelt?

Und wenn ja, kann man da etwas verbessern? Oder kann es
sein, dass ich einen generellen (Denk-)fehler habe?

<Zugriffe auf %str schnell>
...
store( \%str, $sFile );
...
undef( %str );
%str = %{ retrieve( $sFile ) };
...
<Zugriffe auf %str langsam>



Ist der Unterschied genauso extrem, wenn du das auslesen in einem
anderen Prozess (anderes Script) machst? Welches Betriebssystem benutzt
du? Und ist dein Perl mit -Dusemymalloc kompiliert?

Grüße,
Moritz

Moritz Lenz
http://perl-6.de/ http://moritz.faui2k3.org/

Ähnliche fragen