Trick 59:
Superschnelles Einspeisen (großer Mengen neuer Daten)
Aufgabe:
Schnellstmöglich 20.000 oder mehr Datensätze einbringen.
Warum: Es kommt vor, daß man
ohne spürbare Beeinträchtigung des
laufenden Betriebs ganz schnell eine größere Menge neuer
Daten
verfügbar machen will.
Lösung:
Falls es genügt, die neuen
Daten zunächst über einen oder zwei ganz
wichtige Schlüssel finden zu
können, dann läßt sich etwas machen.
Eine Index-Erneuerung irgendwann
später muß dann aber den Index
vervollständigen.
Vorliegen müssen die Daten
zuerst einmal als Grunddatei (Typ .ALG)
oder Externdatei (Typ .ADT).
Dann kommen zwei Tricks zur
Anwendung:
1. Es wird eine abgemagerte
Indexparameterdatei automatisch erstellt,
die nur die ersten
zwei ak-Befehle enthält. Diese wird dann statt
der normalen geladen,
so daß dann neu zu speichernde Daten viel
schneller indexiert
werden können - die Anzahl der Schlüssel ist
nämlich der
Haupt-Zeitfaktor beim Abspeichern.
2. Das Einlesen geschieht
zunächst ohne Speichern mit dem z-Wert 0
beim update-Befehl,
dann gelangen die Sätze nur in den Offline-
speicher. Danach wird
mit "save off" gespeichert. Das geht schneller
als update mit z-Wert
1, denn dabei wartet das Programm jeweils
0.5 Sekunden zwischen
zwei Sätzen.
Als Vorbereitung kann man in den
Indexparametern die ersten zwei
ak-Befehle so präparieren,
daß damit die entscheidenden Schlüssel
erzeugt werden. In cat.api
könnte man etwa direkt unter die Zeile
ak=zz+@
diese neue Zeile einsetzen:
ak=20+G
dann würde der Titelanfang als
zweiter der beiden Schlüssel produziert,
der erste wäre der
Primärschlüssel (IdNummer in #00).
An drei Stellen, mit *** markiert,
muß man eingreifen, bevor man den
FLEX einsetzt:
***1 Sollen es drei oder mehr
Schlüssel sein? Bei z>2 Zahl einsetzen!
Vielleicht sogar nur 1, vielleicht auch 5.
***2 Den korrekten Dateinamen statt
<xyz> einsetzen.
***3 Die Nummer der Datei
einsetzen, in welche die neuen Daten sollen
So sieht der FLEX aus, der beide
Tricks realisiert:
----------------------------------------------------------------
Vorbereitung: Prüfen, ob neue oder bearb. Saetze im
Offline-Speicher
find new
if g0 mes Es
gibt noch ungespeicherte neue Saetze, zuerst speichern!;end
find edit
if g0 mes Es
gibt noch ungespeicherte bearbeitete Daten, zuerst speichern!;end
Wenn
nicht, dann Offline-Speicher leeren
erase off
1.
Indexparameter abspecken: nur die ersten 2 ak-Zeilen
alles andere bleibt drin.
var D B "."
K1 "pi"
open
if no mes
Kann die Indexparameter nicht finden!;end
Abgespeckte Datei soll mager.api heissen und auf DbDir liegen
var D
"mager." K1 "pi"
open x
z=0
:loop
get
if cancel
jump lend
Kommentare und leere Zeilen weglassen
if " " jump
loop
if "" jump
loop
ak-Zeile gefunden: zaehlen, bei 3 abbrechen ***1
if "ak="
z+1;if z>2 jump loop
write
write n
jump loop
:lend
close
close x
Magere
Index-Param.datei ist fertig
Diese
jetzt laden
var "mager"
index p
2.
Update
Einstellung: alle Saetze nehmen, aber nicht sofort speichern
set u010
Dateinummer für die neuen Daten (Nummer von 1 bis 255) ***3
input 129
Datei
<xyz> einspeisen. Statt <xyz> den echten Namen einsetzen!
***2
update
<xyz>
Daten
jetzt im Offline-Speicher
Fragen
ob Speichern gewuenscht
yesno
Speichern?
if yes save
offline
if no var
"Speicherung dann auf Wunsch mit 'x save off'" n "Oder Abbruch mit 'x
erase off'";mes
sho off
Jetzt
sind die Sätze gespeichert und "mager" indexiert
Die
normalen, fetten Indexparameter wieder laden
var B
index p
Dateinummer zurücksetzen ***3
input 1