Auswertung große DBF/komplexe Filter beschleunigen

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Benutzeravatar
Christof
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 265
Registriert: Mo, 01. Okt 2007 17:14
Wohnort: Bedburg
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal

Auswertung große DBF/komplexe Filter beschleunigen

Beitrag von Christof »

Hallo,

über die Feiertage habe ich mir mal wieder Gedanken gemacht, wie ich die Auswertung einer Kundendatenbank in meinem Programm entscheidend beschleunigen kann. Vlt. helfen mir ein paar Hinweise/Ideen von Euch.

Kurz zur Installation:
- Keine Multiuserfähigkeit (ist für die Anwendung nicht nötig). Alle DBFs werden exclusiv geöffnet.
- Kundendatenbank in EINER DBF mit 131 Feldern und bis zu 200.000 Datensätzen
- Läuft i.d.R. lokal, kann aber auch auf einem Netzlaufwerk installiert sein
- Native Xbase-Code

Es müssen keine einzelnen Datensätze gefunden werden, sondern es wird immer die gleiche Ergebnistabelle erstellt in der ca. 60 numerische Felder der Kundendatei nach unterschiedlichen Kriterien summiert aufgelistet werden. Auf einer Dialogseite können über Eingabefelder (SLEs), Listboxen, Checkboxes und Radiobuttons ganz unterschiedliche Kriterien für die Filterung der DBF gewählt werden. Nach Klick auf "Auswertung" wird über die Abfrage der Kriterien-Elemente eine (teilweise SEHR) komplexe Filterbedingung zusammengestellt.

(1) Zunächst hatte ich dann mit "SET FILTER TO &MeinFilter" und "Go Top" die Filterbedingung aktiviert und den ersten Datensatz angesprungen. Ich weiß dann allerdings (zunächst) nicht, wie viele passende Datensätze vorhanden sind und kann z.B. keine passende Progressbar anzeigen. Außerdem dauert die Suche bis zum ersten Treffer u.U. ziemlich lange. Ein anschließendes "RECCOUNT()" dauert wieder ewig.

(2) Seit einiger Zeit habe ich das dergestalt geändert, dass ich immer in einer Do-While-Schleife die gesammte DBF durchlaufe und über "IF &MeinFilter" prüfe, ob der aktuelle Satz passt oder nicht. Anzeigeproblem gelöst, aber eben auch nicht gerade schnell.

Egal ob (1) oder (2), es werden dann immer die Werte gesammelt und in Variablen aufaddiert. Also so ähnlich wie bei "Total on..."

Ich versuche, es noch etwas deutlicher zu beschreiben:
Der Anwender kann aus einer Listbox auswählen, ob nur eine, mehrere oder alle Filialen einbezogen werden sollen.
Der Anwender kann aus einer Listbox auswählen, ob nur ein Kundenberater oder mehrere oder alle Berater einbezogen werden sollen.
Der Anwender kann über einer Checkbox wählen, ob nur Mitglieder ausgewertet werden sollen.
Der Anwender kann über einen Radiobutton wählen, ob nur Kunden einer bestimmten Risikogruppe ausgwertet werden.
Der Anwender kann über SLEs einstellen, dass Kunden mit bestimmten Beträgen im Topf1, Topf2.... zusammengefasst werden.
.... (es gibt noch einige "Filterschaltungen" mehr).

Alle Bedingungen sind UND-Bedingungen. Die Anzahl der auszuwertenden Datensätze wird also immer kleiner.

Scope fällt aus, weil egal wie ich den Index setze, (fast) nie die relevanten Datensätze logisch hintereinander liegen würden.


&MeinFilter sieht z.B. so aus: "EPENG->Filiale $ {'Düsseldorf', 'Köln', 'München', 'Bedburg', 'Glesch'};
.AND. EPENG->Berater $ {'KDB01','KDB02','FKB03','FKB07','SER01','SER02','SER03'};
.AND. EPENG->Mitglied = 'J';
.AND. EPENG->ART = 'P';

(Das ist ein eher kleiner, einfacher Filtertext.)


Momentan läuft es also ungefähr so:

Code: Alles auswählen


---

dbSelect("EPENG")
dbGoTop()

Do while !eof()

 if &MeinFilter
   
  if EPENG->aktivv >= Topf1AktivVon .AND. EPENG->aktivv < Topf1AktivBIS

   nAktivvolumen1+=EPENG->aktivv
   nAnlagevolumen1+=EPENG->anlagev
   nErgebnis1+=EPENG->Ergebnis

  elseif EPENG->aktivv >= Topf2AktivVon .AND. EPENG->aktivv < Topf2AktivBIS

   nAktivvolumen1+=EPENG->aktivv
   nAnlagevolumen1+=EPENG->anlagev
   nErgebnis1+=EPENG->Ergebnis

  elseif EPENG->aktivv >= Topf2AktivVon .AND. EPENG->aktivv < Topf2AktivBIS

   nAktivvolumen2+=EPENG->aktivv
   nAnlagevolumen2+=EPENG->anlagev
   nErgebnis2+=EPENG->Ergebnis

  elseif EPENG->aktivv >= Topf3AktivVon .AND. EPENG->aktivv < Topf3AktivBIS

   nAktivvolumen3+=EPENG->aktivv
   nAnlagevolumen3+=EPENG->anlagev
   nErgebnis3+=EPENG->Ergebnis

 endif


 dbSkip()

Enddo



...
In Wirklichkeit ist es natürlich noch ein ganzes Stück komplizierter. Bei 100.000 Datensätzen und mehr kommen so nicht selten Zeiten von 30-60 Minuten für eine einzige Auswertung zusammen, obwohl vlt. nur 3.000 Datensätze tatsächlich in die aktuelle Auswahl fallen. Da freut es heutzutage leider kaum noch jemanden, dass er/sie überhaupt solche tollen Auswertungen auf Knopfdruck machen kann. ;-)

Meine Fragen/Gedanken kreisen um folgende Möglichkeiten/Alternativen:
o Könnte es etwas bringen, die ganze DBF in ein Array zu ziehen und dann quasi im Speicher zu arbeiten und nicht auf der DBF?
o Wie wäre es, wenn ich tatsächlich den Filter aufbaue, setze, dann die Ergebnisdatensätze in eine TEMP exportiere und nur diese auswerte?
o Sollte ich statt "IF &MeinFilter..." die einzelnen Filterteile in einer Art "Filterkaskade" mit tief verschachtelten IF-THEN-ELSEIF-Strukturen abfragen? Wird irre unübersichtlich, oder?
o Bei jedem Treffer werden ca. 60 Summenvariablen bearbeitet. Wären 60 Durchläufe mit jeweils EINER bearbeiteten Summenvariablen schneller? Ich denke eher nicht, oder?
o ... ?

Wer hat ein paar zielführende Tipps für mich, die ich mal ausprobieren kann?
Wie geht Ihr bei solchen Aufgabenstellungen vor?

Wer sich ein Bild davon machen will, kann hier nachsehen: https://www.ggbbg.de/content/dam/f8998- ... er2013.pdf
Seiten 10-14 sind gemeint.

Vielen Dank an alle, die hier mal mit denken oder mitdenken.

Viele Grüße, besonders an Jan ;-), aber natürlich auch an alle anderen

Christof

p.s. "Frohes, neues Jahr!" (Darf man noch sagen, oder?)
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Auswertung große DBF/komplexe Filter beschleunigen

Beitrag von Martin Altmann »

Moin,
Danke und ebenso.
Schau Dir mal DbEval() an - damit dürftest Du das recht elegant und schnell lösen.

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Christof
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 265
Registriert: Mo, 01. Okt 2007 17:14
Wohnort: Bedburg
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal

Re: Auswertung große DBF/komplexe Filter beschleunigen

Beitrag von Christof »

Hallo Martin,

DBEVAL() schlägt Do-While geschwindigkeitstechnisch nicht wirklich.

Ich glaube, ich muss mal an der Fortschrittsanzeige (STATIC mit SetCaption...) arbeiten. Die scheint das Ganze ziemlich zu bremsen.

Gruß

Christof
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Auswertung große DBF/komplexe Filter beschleunigen

Beitrag von Martin Altmann »

Christof hat geschrieben:DBEVAL() schlägt Do-While geschwindigkeitstechnisch nicht wirklich.
Da habe ich andere Erfahrungen gemacht - nämlich genau gegenteilige :!:
Aber:
Christof hat geschrieben:Ich glaube, ich muss mal an der Fortschrittsanzeige (STATIC mit SetCaption...) arbeiten. Die scheint das Ganze ziemlich zu bremsen.
definitiv! Schalte die mal komplett ab, und Du wirst schon einen Unterschied merken (auch zwischen Do-While und DbEval())

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Christof
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 265
Registriert: Mo, 01. Okt 2007 17:14
Wohnort: Bedburg
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal

Re: Auswertung große DBF/komplexe Filter beschleunigen

Beitrag von Christof »

Hab's hiermit getestet:

Code: Alles auswählen

 oProgress:current:=1
 oXbpMeld:setCaption("Do-while-Schleife...")
 nVon1:=seconds()
 do while !eof()
  oProgress:increment()
*  oSatz:SetCaption(dStr(t++,10,0)+"/"+dStr(nSaetze,10,0))
*  oSatz:InvalidateRect()
  replace epeng->fil with 1
  dbSkip()
 enddo
 nBis1:=seconds()

 dbGoTop()
 MsgBox("Fertig, "+str(nBis1-nVon1,15,3),"Meldung")

 oProgress:current:=1
 oXbpMeld:setCaption("DBEVAL...")
 t:=0
 nVon2:=seconds()
 dbEval({|| ;
  oProgress:increment(),;
  epeng->fil:=1})
 nBis2:=seconds()

 * oSatz:SetCaption(dStr(t++,10,0)+"/"+dStr(nSaetze,10,0)),;
 * oSatz:InvalidateRect(),;
 MsgBox("Fertig, "+str(nBis1-nVon1,15,3)+" | "+str(nBis2-nVon2,15,3),"Meldung")

Do-While hatte 3,6 und DBEVAL hatte 3,7 Sekunden. Ca. 180.000 Datensätze. Das ist schnell und 10 x schneller als MIT der Anzeige.

Vlt. kommt der Geschwindigkeitsvorteil von DBEVAL erst raus, wenn ich auch die Bedingungsblocks dort nutze?!

Gruß

Christof
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Auswertung große DBF/komplexe Filter beschleunigen

Beitrag von Martin Altmann »

Genau darum geht es doch auch - bei DbEval() bereits im Block die Filterbedingung mit anzugeben ;-)
Abschalten musst Du nachher die Anzeige ja nicht - nur wesentlich seltener aktualisieren lassen. Also z.B. alle 100 Sätze um 100 Einheiten den Balken weiterschieben (oder die Prozentzahl zu erhöhen). Ist schon wesentlich schneller, als dies bei jedem Satz zu tun.

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Auswertung große DBF/komplexe Filter beschleunigen

Beitrag von AUGE_OHR »

Christof hat geschrieben:Hab's hiermit getestet:

Code: Alles auswählen

 do while !eof()
  oProgress:increment()
Do-While hatte 3,6 und DBEVAL hatte 3,7 Sekunden. Ca. 180.000 Datensätze. Das ist schnell und 10 x schneller als MIT der Anzeige.
wie du schon festgestellt hast ist die (dauernde) Anzeige das Problem.

bei einem "alten" Progressbar hätte man ja nur 100 Kästchen -> Lastrec() / 100 -> nEvery

Code: Alles auswählen

IF ((nValue) % (nEvery)) = 0
   oProgress:increment()
gruss by OHR
Jimmy
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Auswertung große DBF/komplexe Filter beschleunigen

Beitrag von Jan »

Moin Christof,

oha! Fortschrittsanzeige mit XbpStatic()? Das kann enorm aufhalten. Wenn Du so viele Datensätze abarbeitest, dann wird das um einiges ausgebremst.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Auswertung große DBF/komplexe Filter beschleunigen

Beitrag von brandelh »

Das war schon unter Clipper so. Daher immer einen Zähler mitlaufen lassen und entweder alle 100 Sätze den Update machen oder wenn sich die Anzeige ändert (z.B. bei % Werten).
Die IF Abfrage bremst kaum, der Zugriff auf die Anzeige sehr.
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Auswertung große DBF/komplexe Filter beschleunigen

Beitrag von Jan »

Ich mach das deswegen immer so, das bis 100 jeder Satz angezeigt wird, bis 1.000 jeder 10., bis 10.000 jeder 100., bis 100.000 jeder 1.000., und darüber jeder 10.000. Zum Ende dann immer der reale Schlußwert, damit der Anwender nicht irritiert ist.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Auswertung große DBF/komplexe Filter beschleunigen

Beitrag von Martin Altmann »

Das heißt, zum Ende hin wird die Anzeige seltener aktualisiert? Und somit langsamer? Das verwirrt aber!
Oder berechnest Du das Intervall am Anfang einmalig?

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Auswertung große DBF/komplexe Filter beschleunigen

Beitrag von Jan »

Hallo Martin,

doch, zum Ende hin wird der Intervall immer größer. Oftmals weiß ich zu Beginn ja noch garnicht, was da noch alles kommen könnte. Wenn ich vorher schon weiß, wie viele Sätze es definitiv werden, dann könnte man natürlich von Anfang an mit den entsprechend großen Schritten arbeiten. Aber auch das könnte verwirrend sein - der Nutzer startet eine Auswertung, aber es wird nichts hochgezählt. Weil die Schrittweite sehr groß ist.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Auswertung große DBF/komplexe Filter beschleunigen

Beitrag von brandelh »

Mehr als 1000 bringt keine Geschwindigkeitsvorteile und der Anwender sieht wenigstens die Anzeige arbeiten ;-)
Gruß
Hubert
Benutzeravatar
azzo
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 483
Registriert: So, 28. Mär 2010 19:21
Danksagung erhalten: 11 Mal

Re: Auswertung große DBF/komplexe Filter beschleunigen

Beitrag von azzo »

Hallo Christof,
könntest du nicht einen temporären Index erzeugen.
mfg
Otto
Benutzeravatar
Rolf Ramacher
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1930
Registriert: Do, 09. Nov 2006 10:33
Wohnort: Bergheim
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Auswertung große DBF/komplexe Filter beschleunigen

Beitrag von Rolf Ramacher »

Guten Morgen,

Christoph. wie wäre es in diesem Fall ggf. mit ADS zu arbeiten um hierfür SQL-Statements abzusetzen. Welche Datenbank das ist, ist nicht so wichtig. wenn ich das richtig im Kopf habe.
Gruß Rolf

Mitglied der Gruppe XUG-Cologne
www.xug-cologne.de
Benutzeravatar
Christof
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 265
Registriert: Mo, 01. Okt 2007 17:14
Wohnort: Bedburg
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal

Re: Auswertung große DBF/komplexe Filter beschleunigen

Beitrag von Christof »

Hallo Otto,

die Idee mit dem temporären Index ist im Grunde gut. Ich fürchte nur, der Indexausdruck wird ziemlich komplex und ob (dann) der Aufbau schneller ist, als gleich über einen Filter zu arbeiten müsste ich mal testen.

Hallo Rolf,

andere Datenbanken sind VIELLEICHT an dieser Stelle etwas schneller. Aber dann müsste ich das ganze Konzept ändern. Kann noch kommen, ist aber im Moment keine Alternative.

Hallo an alle,

die Hinweise mit den Schritten bei der Anzeige haben schon Beschleunigungen von über 30 % gebracht. Das geht jetzt (auch an anderen Stellen im Programm) relativ fix. Beim Durcharbeiten ist mir dann noch ein kleiner "Schalterfehler" aufgefallen. Eigentlich sollte eine spezielle Zusammenstellung (die ziemlich bremst) der relevanten Daten nur bei einer entsprechenden Einstellung erfolgen. Dummerweise war die Prüfvariable am Anfang gleich auf .T. gestellt, statt auf .F. Es wurde also immer zusammengestellt. :( Einstellung geändert, Anzeige nur alle 1.000 Datensätze und... 80 % (!) schneller in der Auswertung. Das reicht erst mal.

Also: VIELEN DANK FÜR'S MITDENKEN UND MIT DENKEN!

Gruß

Christof
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Auswertung große DBF/komplexe Filter beschleunigen

Beitrag von Tom »

andere Datenbanken sind VIELLEICHT an dieser Stelle etwas schneller.
Im von Dir geschilderten Szenario - exklusiver und direkter Zugriff - dürfte ein Datenbankserver (ADS o.ä.) vermutlich eher eine Verlangsamung bewirken, denn es handelt sich um eine weitere Instanz, die zwischen der auswertenden Applikation und dem physikalischen Massenspeicher tätig wird.
Herzlich,
Tom
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Auswertung große DBF/komplexe Filter beschleunigen

Beitrag von brandelh »

Ich kopiere die auszuwertenden Daten einmalig in eine temporäre Datei, die ist meistens deutlich kleiner.
Eine SSD oder gar eine RAM-Disk könnten zusätzlich Geschwindigkeit bringen (ich nutze SSD).
Gruß
Hubert
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: Auswertung große DBF/komplexe Filter beschleunigen

Beitrag von UliTs »

Tom hat geschrieben:
andere Datenbanken sind VIELLEICHT an dieser Stelle etwas schneller.
Im von Dir geschilderten Szenario - exklusiver und direkter Zugriff - dürfte ein Datenbankserver (ADS o.ä.) vermutlich eher eine Verlangsamung bewirken, denn es handelt sich um eine weitere Instanz, die zwischen der auswertenden Applikation und dem physikalischen Massenspeicher tätig wird.
Wenn die Hardware, auf dem der Datenbankserver läuft, wesentlich mehr Power hat als die lokale Station, ist auch dies vermutlich schneller.

Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Auswertung große DBF/komplexe Filter beschleunigen

Beitrag von Jan »

Aber in diesem Fall gibt es ja keinen Server. Das ist eine Einzelplatzanwendung.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Auswertung große DBF/komplexe Filter beschleunigen

Beitrag von Tom »

Wenn die Hardware, auf dem der Datenbankserver läuft, wesentlich mehr Power hat als die lokale Station, ist auch dies vermutlich schneller.
Wenn der Datenbankserver extrem heißes Caching betreibt - im Idealfall alle Daten in den Arbeitsspeicher holt - und sonstwie optimiert ist/verwendet wird, ist es auch schneller. Wenn man aber einfach die ADS mit der Standard-DBE reinklemmt, ohne große Optimierungsarbeiten, dann nicht.
Herzlich,
Tom
Benutzeravatar
Christof
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 265
Registriert: Mo, 01. Okt 2007 17:14
Wohnort: Bedburg
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal

Re: Auswertung große DBF/komplexe Filter beschleunigen

Beitrag von Christof »

Hallo,
ich möchte das Thema noch einmal aufgreifen. Die Vorschläge von damals haben gut weitergeholfen und einige Zeit gehalten.
Jetzt kriege ich "Gegenwind" von anderer Seite. Die Kunden nutzen nun fast ausschließlich zentral gehostete Laufwerke. Mein Programm läuft - nach wie vor - lokal. Es lohnt eigentlich auch keine grundlegende Umstrukturierung.

Das Problem ist, dass die Arbeiten auf den DBFs jetzt extrem verlangsamt sind, weil die Verbindung zu den Netzlaufwerken in die Knie geht. Und wenn dann eine Bearbeitung mit

Do while !eof()
...
skip()
enddo

erfolgt, hat man halt bei jedem Datensatz Traffic auf der Leitung.

Auswertungen/Bearbeitungen die lokal 5 Sekunden dauern, laufen dann schon mal 1 Minute oder länger. Es gibt auch Bearbeitungen, die normalerweise so ca. 15 Minuten dauern. Das macht natürlich dann überhaupt keinen Spaß mehr.

Meine Idee war jetzt, die eine oder andere DBF komplett in den Speicher zu holen und dort zu bearbeiten. RAM ist ja im Prinzip unbegrenzt vorhanden. Ich meine auch irgendwo mal gelesen zu haben, wie das gehen könnte. Finde ich aber nicht mehr. :-(
Ich weiß, dass man eine DBF auch reltiv einfach und schnell in ein Array ziehen kann. Aber dann muss ich natürlich alle Funktionen umschreiben, die damit etwas machen sollen.

Wenn ich die DBFs in den Speicher hole, muss ich natürlich darauf achten, dass ich diese auch wieder (sicher) zurückschreibe.

Merci für Eure Gedanken.

Vielen Grüße

Christof
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Auswertung große DBF/komplexe Filter beschleunigen

Beitrag von Jan »

Hallo Christof,

Du könntest das machen per SELECT. Sowas macht Manfred, aber das hakt noch bei den DataObjects. Ansonsten kannst Du natürlich alle Sätze mit SCATTER in ein DataObject einlesen und in ein Array hinzufügen. Der Vorteil, wenn Du mit DataObjects arbeitest, ist halt, das Du weiter mit den Feldnamen arbeiten kannst. Weil die halt die Namen auch im DO sind. Statt alias->feldname arbeitest Du dann mit oDo[index]:feldname. Klar ist auch das noch Arbeit, aber das ist relativ flott machbar, teilweise sogar mit Suchen und ersetzen. Und auch Browsen kannst Du darauf, weil Du ja auch dort mit den Feldnamen arbeiten kannst. In der Hilfe von Alaska gibt es ein Codebeispiel über ein XbpBrowse auf ein Array.

Ich selber mache sowas öfters. Sowohl alle relevanten Sätze als DO in ein Array packen und dort abarbeiten, als auch solch ein Array zu browsen. Wirklich sehr komfortabel.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Christof
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 265
Registriert: Mo, 01. Okt 2007 17:14
Wohnort: Bedburg
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal

Re: Auswertung große DBF/komplexe Filter beschleunigen

Beitrag von Christof »

Hallo Jan,

danke, muss ich mir mal anschauen.

Mit Scatter ins Array und später mit Gather wieder in die DBF?

Viele Grüße

Christof
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Auswertung große DBF/komplexe Filter beschleunigen

Beitrag von Jan »

Hallo Christof,

genau. Ich mach das dann immer so das ich nach einem SCATTER immer noch ein oDo:recno := alias->(RecNo()) mache, bevor ich den ins Array setze. Dann kann ich vor dem GATHER direkt für diesen Satz den korrekten Satz in der dbf anspringen.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Antworten