[Allegro] Trick 59: Superschnelles Einspeisen neuer Daten
Bernhard Eversberg
ev at biblio.tu-bs.de
Mo Okt 29 11:32:16 CET 2007
Trick 59: Superschnelles Einspeisen
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
----------------------------------------------------------
Mehr Informationen über die Mailingliste Allegro