Embedded Metadata B-Tree – Effiziente Organisation des Festplattenzugriffs 29.10.2007 Wiederholung 1. Der Zugriff auf die Festplatte ist verhältnismäßig langsam. Am meisten Zeit benötigt das Bewegen des Lese/Schreibarms (seeking). 2. Hauptspeicher ist schnell aber auch knapp. In der Regel müssen sich mehrere Programme den Hauptspeicher teilen. 3. Programme können, den ihnen zugewiesenen Speicher selbst verwalten. Die Organisation von Daten im Hauptspeicher lässt sich mit Hilfe von Datenstrukturen beschreiben. 4. Eine Datenstruktur implementiert ein Organisationskonzept sowie Algorithmen, die mit dem gegebenen Konzept umgehen können. 5. Datenstrukturen haben häufig Gemeinsamkeiten. Gute Programmbibliotheken erlauben einen abstrakten vereinheitlichten Zugriff auf Klassen von Datenstrukturen. 6. Datenstrukturen können persistiert werden. Für eine optimale Persistierung spielt die Beschaffenheit der Datenstruktur eine Rolle. 7. Wenn eine Datenstruktur zu groß wird, können Teile auf den sekundären Speicher ausgelagert werde. 8. Wir können Datenstrukturen benutzen um den Zugriff auf den Sekundärspeicher zu optimieren. Index Ein Index besteht aus einer Sammlung von Indexelementen. Ein Indexelement besteht aus einem Paar (KEY,REF). Der Index kann nach dem KEY-Element durchsucht werden. Das REF-Element referenziert weitere Informationen zu dem Schlüssel. Beispiel: Bibliothekskataloge. Indexelement(Autor,{Bibliographische Informationen, Standort}). Indexelement(Titel,{Bibliographische Informationen, Standort}) Beispiel: Diese Veranstaltung behandelt mehrere Themen. Jedes Thema wird unter einem bestimmten Namen behandelt. Der Name ist der Schlüssel zu weiterer Information. Diese Veranstaltung ist damit ein Index, über den weitere Informationen leichter erreichbar gemacht werden sollen. Ein Index im Hauptspeicher zur Optimierung des Festplattenzugriffs Idee: Anstatt eine ganze Datei in den Hauptspeicher zu laden, generieren wir einmal einen Index. Jedes Indexelement hält den Schlüssel, über den wir die Information erreichen wollen und eine Referenz auf die Position in der Datei, an der die Zugehörigen Daten zu finden sind. Vorteil: Wir sparen Hauptspeicher und können jede Information auf der Platte direkt anspringen. Problem: Was passiert, wenn der Index selbst so groß wird, daß er nicht in den Hauptspeicher passt? Unterstützung großer Indexe mit Hilfe des Sekundärspeichers Annahmen: 1. Der Index passt nicht in den Hauptspeicher und muss daher teilweise auf dem Sekundärspeicher liegen 2. Der Sekundärspeicher ist so beschaffen, daß er eine relativ lange Zugriffszeit aber eine schnelle Transferrate hat. Anforderungen: 1. Die Datenbasis darf veränderbar sein. D.h. Der Index muss das Einfügen und Löschen von Indexelementen unterstützen Ausgangspunkt Binärbaum Idee: Wir nehmen einen Binärbaum als Index. Dann überlegen wir uns eine Möglichkeit den Baum auf die Platte zu speichern und führen dann die Operationen, die wir sonst im Hauptspeicher erledigen direkt auf der Platte aus. Probleme des Ansatzes 1. Wenn wir immer einen Schlüssel des Baumes von der Platte holen, benötigen wir zu viele Plattenzugriffe. Binäres Suchen auf der Platte ist zu langsam: 1000 Indexelemente => ~10 seeks 1.000.000 Indexelemente => ~20 seeks 2. Wir benötigen relativ viel Speicherplatz 3. Einfüge- und Löschoperationen in einen Binärbaum benötigen eine Neuanordnung mehrere Elemente. Optimierung – Paged Tree Idee: Um die Festplattenzugriffe zu reduzieren. Lesen wir nicht nur einen Knoten des Baums ein, sondern mehrere. Dazu verspeichern wir den Baum so, daß immer eine feste Anzahl von k Knoten in einem Plattenblock gespeichert wird. Während wir vorher einen Schlüssel und die Referenzen auf zwei neue Teilbäume mit jedem Plattenzugriff erhalten haben, erhalten wir nun k Schlüssel und k+1 Referenzen auf neue Teilbäume. Probleme Paged Tree 1. Der Paged Tree löst zwar im besten Fall das Problem der Zugriffszeit: Binärbaum mit einem Schlüssel und zwei Refernzen pro seek benötigt für 134 217 727 Elemente = 27 seeks um zu einem Blatt zu gelangen. Ein Paged Tree mit 511 Schlüsseln und 512 Referenzen pro seek benötigt für 134 217 727 Elemente = 3 seeks um zu einem Blatt zu gelangen. 2. Allerdings ist es unmöglich den gesamten Baum mit akzeptablem Aufwand balanciert zu halten. Es können lediglich die einzelnen pages balanciert werden. Wir benötigen einen Algorithmus, der es erlaubt die richtigen Schlüssel als Wurzelknoten einzusetzen und der ausserdem die Schlüssel sinvoll auf die einzelnen pages verteilt. 3. Das Beispiel zeigt, daß wir sieben Schlüssel und 14 Referenzen benötigen um zwischen acht Teilbäumen zu unterscheiden. Andere Möglichkeiten –Multilevel Indexing Multilevel Indexing Angenommen wir haben eine ~80 MB große Datei mit 8 000 000 records. Jeder record ist 100 Bytes groß und enthält einen 10 Byte großen Schlüssel. Key | Eigenschaft 1 | Eigenschaft 2 | ... Key 1 | .... | |... Key 2 | ... ... Key 8 000 000 | Multilevel Indexing Step 1: Die Schlüssel müssen aus der Datei extrahiert und sortiert werden. Step 2: Annahme wir können 100 Schlüssel mit ihren Referenzen in einen Indexrecord speichern. Index1 1 (Key, Ref)1 , (Key,Ref)2, ... , (Key, Ref)100 2 (Key,Ref)101, ... ... ... 80000 (Key,Ref... , (Key,Ref) 200 Wir erhalten eine Datei mit 80 000 records und haben damit die Suche um Faktor 100 verbessert. Wir können nun weiter optimieren indem wir einen Index auf den Index erstellen. Hierzu nehmen wir jeweils den größten Schlüssel aus jedem Indexrecord und speichern ihn zusammen mit einer Referenz in einem weiteren Index. Index 2 1 (Key,Ref)100, (Key,Ref)200, ... ,(Key,Ref) 10000 2 (Key,Ref)10100, (Key,Ref)10200, ... ,(Key,Ref) 20 000 ... 800 (Key,Ref... Multilevel Indexing Wir können nun einen weiteren Index mit acht records generieren Index 3 1 (Key,Ref)10 000, (Key,Ref)20 000, ... , (Key,Ref)1 000 000 2 (Key,Ref)1 010 000, ..., (Key,Ref)2 000 000 ... 8 (Key,Ref ... Schließlich können wir Index mit einem record mit acht Elementen erzeugen Index 4 1 (Key,Ref)1000 000, ..., (Key,Ref) 8 000 000 Multilevel Indexing Wenn wir nun eine Information zu einem Schlüssel 27534 suchen können wir folgendermaßen vorgehen: 1. Wir lesen den record aus Index 4 ein und gehen die einzelnen (Key,Ref) Paare durch. Ist unser Schlüssel kleiner gleich dem Schlüssel eines Indexelementes, so lösen wir die entsprechende Referenz auf. 2. D.h. Wir lesen den record aus Index 3, der durch (Key,Ref)1 000 000 referenziert wird. Beim Indexelement (Key,Ref)30 000 stoppen wir erneut und lesen den entsprechenden record aus Index1. 3. Usw. 4. In diesem record befindet sich nun das Indexelement mit der Referenz auf die Originaldatei. Angenommen wir halten Index4 im Haupspeicher, dann können wir mit nur vier seeks einen beliebigen Record von 8 000 000 möglichen identifizieren! Wir habe sogar in Index 4 noch 92 Plätze frei. Wir könnten also auch die Zwölfache Menge an records erreichen ohne weitere Plattenzugriffe zu benötigen. Dies entspräche einer Dateigröße von 10GB. Multilevel Indexing – Probleme Was passiert, wenn wir einen neuen Schlüssel in den Index einfügen müssen? Wie viele Plattenoperationen sind notwendig wenn der neue Schlüssel der kleinste im Index ist? B-Tree - Grundidee 1. Ein Btree ist ein Multilevel-Index, der Veränderungen an der Datenbasis effektiv unterstützt 2. Ein Indexrecord muss nicht voll sein 3. Wenn ein record überläuft, werden die überzähligen Elemente nicht einfach in den nächsten record geschoben, sondern es wird ein neuer record erzeugt, der die Hälfte der Elemente des übergelaufenen Records erhält. 4. Jedes Indexrecord wird in Form eines Knotens im Baum modelliert. 5. Für jedes record ist eine Höchstzahl (order) und eine Mindestzahl (typisch order/2) von Indexelementen definiert. 6. Der Wurzelknoten muss mindestens zwei Indexelemente enthalten. 7. Die einzelnen Knoten werden über den größten enthaltenen Schlüssel identifiziert. Begriffe 1: key promotion Wenn ein neuer Schlüssel eingefügt wird und er der größte Schlüssel in seinem Knoten ist, muss der Vaterknoten aktualisiert werden. Dies kann über mehrere level im Baum gehen. order Maximal erlaubte Anzahl pro Knoten B-Tree – Beispiel CSDTAMPIBWNGURKEHOLJYQZFXV 1. C S D T B-Tree – Beispiel AMPIBWNGURKEHOLJYQZFXV 2. A B-Tree – Beispiel MPIBWNGURKEHOLJYQZFXV 3. M P I B-Tree – Beispiel BWNGURKEHOLJYQZFXV 4. B W, N, G B-Tree – Beispiel URKEHOLJYQZFXV 5. U B-Tree – Beispiel RKEHOLJYQZFXV 6. R B-Tree – Beispiel KEHOLJYQZFXV 7. K, E, H ,O , L, J, Y, Q. Z B-Tree – Beispiel FXV 8. F,X, V