IA-Seminar: Bayer-Bäume

Seitenende zurück weiter


2. Bayer-Bäume auf Hintergrundspeichern



+ -

Allgemeines

Problem:
Datenmenge übersteigt die Kapazität des Arbeistspeichers. Die Daten müssen daher auf einem sogenannten Hintergrundspeicher gespeichert werden.


Die Zugriffszeiten auf einem Hintergrundspeicher sind im Vergleich zum Arbeitsspeicher sehr langsam.
(ca. das 10000-fache) Die Zugriffe um Daten aus dem Hintergrundspeicher zu lesen bzw. in den Hintergrundspeicher zu schreiben sollten daher möglichst klein gehalten werden.

Möglichkeiten um auf Daten im Hintergrundspeicher zuzugreifen:

  1. sequentieller Zugriff
  2. Index-Sequentieller Zugriff
  3. Zugriff durch Bayer-Bäume
I. sequentieller Zugriff

Beim Zugriff auf Daten im Hintergrundspeicher wird vom ersten Datensatz an jeder Datensatz eingelesen bis der gewünschte Datensatz gefunden wurde.

Vorteile: Nachteile: II. Index-Sequentieller Zugriff

Im Arbeitsspeicher wird eine Tabelle (Indextabelle) bereitgestellt, in der niedergelegt ist, unter welcher Adresse (Position) ein durch einen Schlüssel identifizierter Satz im Hintergrundspeicher zu finden ist.

Vorteile: Nachteile: III. Zugriff durch Bayer-Bäume

Die Datensätze werden als Bayer-Baum im Hintergrundspeicher organisiert.

Vorteile: Nachteile:




+ -

Organisation einer Datei für einen Bayer-Baum

Eine bestimmte Anzahl an Datensätzen werden zu einer Page zusammengefasst. Jede Page repräsentiert einen Knoten im Bayer-Baum.

Eine Page in einer Datei:

Key 0

Info 0

Link 0

Key 1

Info 1

Link 1

Key 2

Info 2

Link 2

Key 3

Info 3

Link 3

...

...

...

Key N

Info N

Link N

Die Größe der Page sollte so gewählt werden, das bei einem Dateizugriff eine komplette Page eingelesen wird!



Die Link-Komponenten der Elemente sind Integers die die Position des Unterbaumes in der Datei angeben.




+ -

Lesen einer Page



Function LoadPage(Link: Longint): PPage;

Var I: Integer;
    Page: PPage;

Begin
     { ist Link korrekt ? }
     If (Link=Null) or (Link>FileSize(Datenbank)) Then
     Begin
          LoadPage:=Nil;
          Exit;
     End;
     { neue Page erstellen }
     New(Page);
     For I:=0 to maxElemente do
     Begin
          Page^.Elemente[I].Link:=Null;
          Page^.Elemente[I].Key:=0;
          Page^.Elemente[I].Info:=0;
     End;
     Page^.Anzahl:=0;
     If Link=Filesize(Datenbank) Then
     Begin
          LoadPage:=Page;
          Exit;
     End;
     { zur Page-Position sprigen }
     Seek(Datenbank,Link);
     { erstes Element einlesen }
     Read(Datenbank,Page^.Elemente[0]);
     { Schluessel vom ersten Element ist die Anzahl
       der Elemente in der Page }
     Page^.Anzahl:=Page^.Elemente[0].Key;
     { Elemente einlesen }
     For I:=1 to MaxElemente do
      Read(Datenbank, Page^.Elemente[I]);
     LoadPage:=Page;
End;

Funktionsschnittstelle:

Function LoadPage(Link: Longint): PPage;

Die Funktion lädt die Page ein, die sich an der Dateiposition "Link" befindet.

Null hat die gleiche Bedeutung wie Nil im Arbeitsspeicher!

Datenbank ist eine Datei vom Typ "File of TElement".




+ -

Schreiben einer Page



Procedure SavePage(Link: Longint; Page: PPage);

Var I: Integer;
    Element: TElement;

Begin
     If (Link=Null) or (Page=Nil) Then
      Exit;
     Seek(Datenbank,Link);
     Page^.Elemente[0].Key:=Page^.Anzahl;
     For I:=0 to MaxElemente do
      Write(Datenbank, Page^.Elemente[I]);
End;

Prozedurschnittstelle:

Procedure SavePage(Link: Longint; Page: PPage);

Die Pozedur speichert die Page "Page" unter der Position "Link" im Hintergrundspeicher ab.




Seitenanfang zurück weiter

[Inhalt] - [Definition] - [Hintergrundspeicher] - [Suche] - [Einfügen] - [Löschen]
© 1999, Henning Voß und Alexander Saramonow