Aufgaben der Datenorganisation: Effizientes Verwalten von Daten, also Datenorganisation Daten müssen sicher aufbewahrt werden Daten müssen wieder auffindbar sein Daten müssen schnell zugreifbar sein Problem: Einfache Datenstrukturen garantieren geringe Fehleranfälligkeit einfacher Programmcode Komplexe Datenstrukturen garantieren optimale Verwaltung mit schnellen Zugriffen Folgerung für die Praxis: Kompromisse
Hauptaufgabe eines Rechners Rechenwerk Arbeitsspeicher Bus Netz Platte Band
Verwaltung von Magnetplatten Einteilung in gleich große Blöcke: 1024 Bytes bis 32 kbytes und mehr Daten werden blockweise gelesen und geschrieben (Arbeitsspeicher ist Zwischenpuffer zur CPU) Dateien werden in (eventuell sehr vielen) Blöcken abgelegt Ein Block enthält immer nur Daten einer Datei Die Verwaltung von Magnetplatten und Dateien übernimmt das Betriebssystem: Formatieren der Magnetplatten und anderer Datenträger Abspeichern von Dateien Puffern von Datenblöcken im Arbeitsspeicher
Wünsche an die Datenorganisation schnelles Finden von Daten innerhalb einer Datei (geringer Zeitaufwand!) wenig Speicherverbrauch beim Abspeichern aller Daten (geringe Kosten) wenig Aufwand beim Löschen, Einfügen, Ändern (geringer Zeitaufwand) einfacher Algorithmus (wenig Wartung und geringe Fehleranfälligkeit) Nicht alle vier Wünsche sind gleichzeitig voll erfüllbar
Speichermedien Sequentielle Speichermedien: Die Daten werden, beginnend am Anfang des Mediums, direkt hintereinander geschrieben. Adressierbare Speichermedien: Jeder Speicherplatz ist direkt erreichbar. Speichermedium Sequentiell Adressierbar Vorteile billiges Medium, geringer Speicherbedarf Direktzugriff möglich, Einfügen möglich Nachteile Einfügen nicht möglich, Suchen nur sequentiell Medium nicht ganz billig, oft ungenutzte Lücken Typisches Medium Magnetband, CD-ROM Magnetbandkassette Magnetplatte, Disketten, Arbeitsspeicher Typischer Einsatz Archivierung, Datensicherung Überall, wo auf Daten direkt zugegriffen wird
Dateiarten Auf sequentielle Speichermedien wird nur sequentiell zugegriffen Auf adressierbare Speichermedien wird sequentiell oder direkt adressierend zugegriffen Sequentielle Dateien: Die Datensätze sind innerhalb der Datei hintereinander abgespeichert (ohne Lücken) Anwendung: Archivierung, Sicherung, kleine Dateien ( < 50 MBytes) Adressierte Dateien: Die Datensätze sind innerhalb der Datei an bestimmten Adressen abgespeichert. Diese Adresse muss gemerkt werden. Anwendung: große Dateien (im MByte- bis GByte-Bereich) mit kurzen Zugriffszeiten
Direktadressierung Die Speicheradresse ist eine Funktion der dort gespeicherten Daten. Beispiel: Elektronisches Notizbuch Voraussetzung: pro Tag existieren 100 Bytes an Speicherplatz Daten des 2. Februar (33. Tag) sind zu finden: Speicherplätze 3200 3300 (ab Dateibeginn) Allgemein gilt für die gesuchte Adresse A gesucht : A gesucht = f (Suchschlüssel ) Im Beispiel: A gesucht = 100 * (Kalendertag - 1) + Startadresse
Geordnete Speicherung mit Suchschlüssel Direktadressierung mit Suchschlüssel nicht anwendbar, wenn Definitionsbereich des Suchschlüssels zu groß Beispiel: Telefonbuch Menge aller möglichen Namen (Suchschlüssel) ist zu groß Abhilfe: Sortiert speichern und binär suchen! Datenbereich = Gesamte Datei Solange Datenbereich nicht leer oder Eintrag nicht gefunden ist Lies den Suchschlüssel S in der Mitte des Datenbereichs S > Suchbegriff? Ja nein Datenbereich = S = Suchbegriff? linke Datenhälfte ja nein Eintrag gefunden Datenbereich = rechte Datenhälfte
Vor- und Nachteile von Speichertechniken Direktadressierung Vorteile Direktzugriff, direktes Einfügen, direktes Löschen, einfacher Algorithmus Nachteile nur bedingt anwendbar (wegen des zum Teil sehr hohen Speicherverbrauchs) Binäre Suche relativ schnelle Suche, minimaler Speicherverbrauch, leicht anwendbar Löschen aufwendig, Einfügen aufwendig Abhilfe Hash-Verfahren B-Baum ISAM-Datei
Einstufige physische Datenstrukturen Listen auf sequentiellem Speicher Merkmale von Listen auf sequentiellem Speicher: der Anfang der Liste ist bekannt, zu jedem Element existiert ein direktes Nachfolgeelement, am Ende steht ein Ende-Signal. Dies lässt sich wie folgt darstellen: Anfang 1. El. 2. El. letztes El. Ende Sequentielle Speicherung: Anfang 1. Element 2. El. 3. El.... n. El. EOF
Tabellen auf adressierbarem Speicher Tabellen auf adressierbarem Speicher entsprechen der Direktadressierung. Die Merkmale sind: Jedes Element ist direkt zugreifbar, Jedes Element belegt gleich viel Speicherplatz. Beispiel: Tabelle mit 80 Elementen 1. El. 2. El. 3. El. 4. El. 5. El.... 78. El. 79. El. 80. El. Anwendungen: Datenorganisation, Mathematik, Vektoren, Matrizen, Felder
Geordnete Listen auf adressierbarem Speicher Merkmale der geordneten Listen sind: der Anfang ist bekannt, zu jedem Listenelement existiert ein direktes Nachfolgeelement, die Elemente sind nach dem Suchbegriff geordnet, das Binäre Suchverfahren ist anwendbar, am Ende steht ein Ende-Signal. Sind die Listenelemente nicht gleich lang, so ist die Implementierung der Binären Suche etwas aufwändiger. Anwendungen: elektronische Karteien und Bücher. Problem: Einfügen und Löschen
Geordnete verkettete Listen Bei verketteten Listen wird die Reihenfolge über Zeigerketten hergestellt. Die Merkmale sind: der Anfang der Liste ist bekannt, zu jedem Element existiert ein Verweis auf das nächste Element, das Ende ist markiert. 2. Element Anfang 1. Element 3. Element Ende 4. Element Logische Ordnung, keine physische. Anwendung: Betriebssystem, dynamische Prozesse
Zusammenfassung einstufiger Verfahren sequentielle Listen Tabellen geordnete Listen geordnete verkettete Listen sehr gering, da keine Lücken (++) sehr hoch, große Lücken (--) genau 1 Zugriff (++) direkte Änderung (++) stark eingeschränkt gering, aber Elemente gleich groß (+) Binäre Suche (+) Speicherung sequentiell adressiert sequentiell geordnet adressiert Speicher sequentiell adressierbar adressierbar adressierbar Speicherverbrauch Zugriffsdauer sequentielle Suche (-) Änderungsaufwand Anfügen nur Verschieben der am Ende (--) Folgeelemente (-) Einsatzmöglichkeit universell universell auf adressierbarem Speicher Komplexität gering gering gering gering gering, etwas Speicher für Adressen (+) sequentielle Suche (-) nur Adressen ändern (+) universell auf adressierbarem Speicher
Mehrstufige Datenstrukturen Hierarchische Datenstrukturen heißen mehrstufig: Der Zugriff erfolgt mehrstufig über diese Hierarchie. Anschauliches Beispiel: Telefonbuch als Binärbaum mit 15 Einträgen 8 4 12 2 6 10 14 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Datei mit 1 Gigabyte 1 Million Einträge à 1000 Bytes Rechenbeispiel Binäre Suche: log 2 10 6 20 Festplattenzugriffe Festplatte kann eventuell zum Engpass werden Mehrstufige Strukturen: ca. 1 Million Hierarchie-Elemente sind erforderlich mit ca. je 20 Byte 20 MBytes werden ständig im Speicher gehalten 1 Plattenzugriff zum Einlesen der Nutzdaten je Suchvorgang Problem: 1 Milliarde und mehr Einträge
Zusammenfassung der Baumstrukturen Baumstrukturen Speicherung adressiert Speicher adressierbar Speicherverbrauch noch relativ gering (Hierarchiestufen) (+) Zugriffsdauer kurz, da über Hierarchiestufen zugegriffen wird (+) Änderungsaufwand nur Adressen ändern, eventuell auch Hierarchiedaten (+) Einsatzmöglichkeit universell auf adressierbarem Speicher Komplexität hoch: Schieflastigkeit, Ändern und Einfügen! Anwendungen: Aufbau dynamischer Strukturen im Arbeitsspeicher Verzeichnisbaum von Dateisystemen Zerlegen von Ausdrücken bei Compilern
Index Sequentielle Dateien ISAM für Index Sequential Access Method VSAM für Virtual Sequential Access Method Eine ISAM-Datei besteht aus zwei Teilen: Die abgespeicherten Daten in den Datenblöcken Die Indexstufen in den Indexblöcken zum schnellen Suchen Für ISAM-Dateien gilt: Die Daten sind logisch nach dem Suchschlüssel geordnet. Physisch sind die Daten innerhalb jedes einzelnen Datenblocks geordnet. Die Blöcke selbst können beliebig auf dem Speichermedium verteilt sein. Die Indexblöcke enthalten Informationen (Indizes), in welchen Blöcken welche Daten zu finden sind. Die Indexblöcke sind analog zu den Datenblöcken geordnet.
Kartei enthält pro Person 116 Bytes: Beispiel Name (Suchschlüssel) 20 Bytes Vorname 20 Bytes Adresse 40 Bytes Geburtsdatum 6 Bytes Telefonnummer 10 Bytes Beruf 20 Bytes Blockgröße: 1024 Bytes, also maximal 8 Datensätze in jedem Block. Holler Marianne 93055 Regensburg Block 6 Huber Martin 93051 Regensburg Hübsch Maria......... Block 7... Igl Werner... Irm er Lothar... Block 8
Beispiel (Indexblock) Ausschnitt aus Indexblock:... Gruber A dresse Block 6 Huber A dresse Block 7 Irm er A dresse Block 8... Indexblock
Gesucht: Daten zu Frau Hübsch. Suche in einer ISAM-Datei 1 2 Indexblock... Gruber Huber Irmer... 3 4 Gruber......... Hinz... Huber... Hübsch...... Igl... Datenblöcke Irmer.........
Einfügen, Ändern und Löschen in ISAM-Datei Ändern: Problemlos, so lange nicht die Suchdaten geändert werden Löschen: Meist einfach, da nur die Daten im Block gelöscht werden müssen Aber: Falls erstes Datum im Block gelöscht, auch Index anpassen Aber: Falls nun Block leer, Block freigeben und Index anpassen Einfügen: Einfach, falls noch Platz im Block Aber: Falls erster Eintrag im Block, auch Index anpassen Aber: Falls kein Platz mehr frei, neuen Block anfordern und Index anpassen
Splitting-Verfahren Splitting-Verfahren wird ausgelöst, falls Datenblock nicht mehr ausreicht. leer bisheriger Datenblock bisheriger Datenblock leer neuer Datenblock Üblich: Datenblöcke sind nur zu 70-80% gefüllt.
Indexblöcke Indexblöcke werden wie Datenblöcke manipuliert, auch gesplittet! 1. Indexstufe (genau 1 Block) Suchschlüssel Adresse Suchschlüssel 2. Indexstufe Datenblöcke Adresse Schlüssel Einträge
Bewertung von ISAM-Dateien Eine ISAM-Datei mit n Indexstufen benötigt maximal n+1 Einlesevorgänge! Beispiel zum Bedarf der Anzahl von Indexstufen: Blockgröße: 2048 Bytes, Datengröße: 116 Bytes Indexeintragsgröße: 24 Bytes (Schlüssel: 20 Bytes und Adresse) Füllgrad: ca. 75% Folgerung: mittlere Anzahl von Einträgen im Indexblock: 64 mittlere Anzahl von Einträgen im Datenblock: 13. Es lassen sich verwalten: 1 Indexstufe 64 Blöcke 64 13=830 Einträge 97 kbytes Daten 2 Indexstufen 64 2 Blöcke 53000 Einträge 6 MBytes Daten 3 Indexstufen 400 MBytes Daten 4 Indexstufen 25 GBytes Daten
Zusammenfassung der ISAM-Datenstruktur ISAM-Datenstruktur Speicherung adressiert Speicher adressierbar Speicherverbrauch noch gering (+), im ungünstigen Fall zufriedenstellend (o) Zugriffsdauer kurz, über wenige Indexstufen (++) Änderungsaufwand lokal, nur manchmal auch Indexstufe betroffen (+) Einsatzmöglichkeit universell auf adressierbarem Speicher, bei häufigen Änderungen ist gelegentliches Reorganisieren erforderlich Komplexität sehr hoch
Hash-Verfahren (Vorbemerkung) Hash-Verfahren nutzen die Vorteile der Direktadressierung. Direktadressierung: S sei die Menge aller möglichen Suchschlüssel A die Menge aller zur Verfügung stehenden Speicheradressen. Dann gilt f : S A ist bijektiv Jedem Element aus S wird eine eindeutige (!) Adresse in A zugeordnet. Die Mächtigkeit von S und A müssen also übereinstimmen!
Definition (Hash-Verfahren) Gegeben sei eine Funktion h: S A, die jedem Suchschlüssel s S eine (nicht notwendigerweise eindeutige) Adresse a A zuordnet. Sei E S die Menge aller tatsächlich vorkommenden Suchschlüssel. Dann heißt eine Funktion h, eingeschränkt auf die Menge E, eine Hashfunktion zur Menge E: h : E S A. Vorgehen: Ein Eintrag wird an dem Platz abgespeichert, den die Hashfunktion h ermittelt. Problem: Die Funktion h ist auf der Menge S nicht notwendigerweise eineindeutig. Folgerung: Mehrere Einträge werden am gleichen Platz gespeichert!
Ausnahmebehandlung Zur Vermeidung von Mehrfachbelegung erfolgt Ausnahmebehandlung: Versatzfunktion Hashfunktion 2. Ordnung h 2 sucht Ersatzadresse Beispiel: 600 Einträge à 100 Bytes Suchschlüssel sei 20 Bytes Es existiert Datei mit 100 kbytes Größe für bis zu 1000 Einträge Hashfunktion h: 20 h( name) = i 100 ord( name[] i ) mod 1000 i= 1. Versatzfunktion h 2 : ( adr ) h( 2 adr) = 100 ( / 100 + 43)mod1000.
Überblick (Hash) Füllgrad der Hash-Tabellen von 40-60% sind bewährt Bei großen Dateien benötigt Hash zu viel Speicher (gegenüber ISAM) ISAM ist für Magnetplatten besser optimiert Hashtabellen sind fix in ihrer Größe! Hashtabellen müssen initialisiert werden Hash-Tabelle Speicherung direktadresssierend Speicher adressierbar Speicherverbrauch zufriedenstellend (o) Zugriffsdauer sehr kurz, da direktadressierend (++) Änderungsaufwand sehr gering, etwas höherer Löschaufwand (+) Einsatzmöglichkeit universell, nicht geeignet bei schwankender Dateigröße Komplexität hoch bis sehr hoch
Primär- und Sekundärschlüssel Beispiel: KFZ-Kartei KFZnr Name Vorname GebDatum Wohnort KFZ_Typ... R-E 95 Meier Fridolin 05.06.1966 Regensburg...... L-ZM 6 Müller Maria 13.03.1938 Leipzig...... M-J 11 Huber Walter 24.12.1944 München........................... Sortiert nach: KFZ-Nummer Aber: Name ist auch häufig Suchschlüssel
Definition (Primär- und Sekundärschlüssel) Suchschlüssel, nach denen die Datei geordnet ist, heißen Primärschlüssel. Suchschlüssel, nach denen die Datei nicht geordnet ist, heißen Sekundärschlüssel. Beispiel: KFZ-Nummer ist Primärschlüssel Name ist Sekundärschlüssel Problem: Die Funktion f als Ordnungskriterium ist bekannt, nicht aber f -1 Primärschlüssel z.b. KFZ-Nr f f -1 Sekundärschlüssel z.b. Name
Invertierte Dateien Invertierte Dateien sind nach dem Sekundärschlüssel geordnet und werden zusätzlich zur normalen Datei gespeichert. Existiert eine invertierte Datei, so gilt: Schnellzugriff über Primärschlüssel (dank ISAM, Hash, ) Schnellzugriff über Sekundärschlüssel mittels invertierter Datei Sequentielle Zugriffe über andere Suchbegriffe Schematisch dargestellt: Primärschlüssel f Daten Sekundärschlüssel 1 f Primärschlüssel f Daten
Eigenschaften invertierter Dateien Größe: meist weniger als 10% der Originaldatei Je Suchbegriff ein Sekundärschlüssel möglich Invertierte Datei ist um so größer, je länger der Primärschlüssel ist Invertierte Datei Index z. B. ISAM oder Hash Datentabelle Sek.- schlüssel Primärschlüssel Index z. B. ISAM oder Hash Primärschlüssel......... Originaldatei Datentabelle Sek.- schlüssel...............