Hello Dennis,
Bis zu 2 (ggf. auch 4 ) GigaByte kann man das dann mit einem record-direktadressierbaren Flatfile auch noch erledigen. Das ist die zweite von mir vorgeschlagene Methode.
Aber ich habe, sorry, diese Methode immer noch nicht richtig verstanden.
Das macht ja nix. Es ist doch Bestandteil dieses Threads und dann später des Artikels die unterschiedlichen Methoden der Speicherung darzustellen und zu diskutieren. Es wird auch keine allgemeingültige richtige[tm] Methode geben. Das muss man von Fall zu Fall entscheiden, was man braucht.
Grundsätzlich sind verschiedene Methoden möglich (nur Teilmenge...):
- Monolithische Speicherung (unsere Arraymethode)
- Textdatei (CSV & Co.)
- Satzweise Speicherung mit wahlfreiem Zugriff aber varianter Satzstruktur (unsere 2. Methode)
- Satzweise Speicherung mit wahlfreiem Zugriff und fester Satzstruktur
- Satzweise Speicherung als direktgestreute Datei (Für den Primärschlüssel wird ein leerer
Satz angelegt, egal ob er benötigt wird oder nicht) Auch mit varianter oder statischer
Satzstruktur möglich - Seitenweise Speicherung mit harmonisierten Seiten-/Satzgrenzen --> Baumstrukturen
Gehe ich da jetzt recht in der Annahme, dass bei jeder Änderung im Array, das neue Array einfach hinter das Alte geschrieben wird, und das ganze nicht gelöscht wird?
Nein. Es wird der Satzzeiger auf den Anfang des gelesenen Arrays positioniert und dann wird das alte Array (der alte Datensatz) mit dem neuen übverschrieben. Dazu müssen immer genausoviel Bytes geschreiben werden, wie der Satz groß ist. Dadurch kann man den Beginn eines Datensatzes (die Lage auf der Festplatte) nach der Formel
$offset = ($satznummer-1)*$satzlaenge
berechnen. Der erste Datensatz hat die Nummer 1. Die Nummern beziehen sich nur auf die physikalische Position, nicht auf die logische.
Und beim Einlesen der Daten, wird nur das letzte Array wieder eingelesen? Ich habe es noch nicht durchblickt, wie du durch diese Konstruktion bei get_rec() herrausfindest, wo das letzte Array liegt - es liegt doch immer ganz am Ende, nicht?
Ich übergebe die Satznummer und die Satzgröße an die Funktion.
Aber mal noch im Allgemeinen zu deine rneuen Methode:
Du sagtest, diese Methode sei schneller, ist sie wirklich so viel schneller, das es sich lohn in einem so weit vorteschrittenen Projekt noch umzusteigen?
Sie ist im Prinzip konstant schnell, wenn man weiß, welchen Satz man haben will, unabhängig von der bereits Anzahl der bereits gespeicherten Sätze. Man liest außerdem immer nur den benötigten Datensatz ein, das spart eben enorm Arbeitsspeicher. Alles andere erledigt bereits das Filesystem. Das ist klassisch gewachsen und gilt in dieser klaren Form nur für DOS-Systeme (Disk orientied Systems) also nicht für Einspeichermodelle, wie z.B. OS400 auf AS400 oder ähnlich. PC-Linux ist auch ein DOS *gg*
Und, die Methode wäre nur etwas für Leute, die verdammt viel Speicherplatz haben! Allein aus dem Grund sollte man die alte Methode nicht verwefen - die meisten Leute mit privater oder vielleicht auch kleiner kommerzieller Homepage haben wohl so 100 bis 250 MB Webspace, doof, wenn die Datei schnell 5 MB groß ist.
Verwerfen wollen wir da gar nichts, sondern nach Möglichkeit alle methoden nach und nach vorstellen und erklären, sowie Basis- und Wrapper-Funktionen dafür erstellen, die die Verwendung in PHP-Scripten einfach und bequem macht.
Liebe Grüße aus http://www.braunschweig.de
Tom
Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
Nur selber lernen macht schlau