[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