Ik ben de laatste tijd bezig met een herbouw van onze analyse-programma.
Daar heb ik al menig post over geschreven
Inmiddels is 80% klaar en moet ik tot mijn spijt betuigen dat ik waarschijnlijk totaal verkeerd bezig ben. De performance is nl. beroerd.
Als vergelijking heb ik het huidige programma dat in Delphi is geschreven. De reden dat we nu in VB6 bouwen is dat de kennis van Delphi inmiddels vertrokken is.
Ik zal eerst even in het kort uitleggen wat het programma moet doen.
We voeren meetwerk uit en die meetgegevens worden in tekstbestanden opgeslagen. Elke 20 minuten een nieuw bestand. De indeling van zo'n tekstbestand is eerst een regel met GPS-info, dan een regel met de meetgegevens. De verschillende gegevens zijn door ; gescheiden. De eerste regel bestaat uit 10 variabelen, de tweede uit 512 variabelen.
Doel van het programma is om de meetbestanden in te lezen, te tonen op het scherm (grafisch) zodat eventueel punten verwijderd kunnen worden. Vervolgens worden de meetgegevens (tweede regel) geanalyseerd. De uitkomst van die analyse bestaat uit 5 variabelen.
Deze 5 variabelen samen met de GPS-gegevens (eerste regel) worden het nieuwe databestand, maar nu deze gegevens op 1 regel en in Excel formaat.
Ik had bedacht om alle variabelen via in-memory recordsets (recordset zonder database-connectie) te benaderen.
Dus wat ik eerst doe is de meetbestanden inlezen in een recordset, maar daarbij de meetgegevens (tweede regel) in z'n geheel in een kolom, omdat ik op dit moment nog niets doe met die gegevens.
Vervolgens toon ik deze recordset in een MSFlexgrid en in een ActiveX-component die makkelijk GPS-data kan tonen.
De gebruiker kan nu punten verwijderen.
Performance is nog goed:
LeesOpgeslagenData duurde: 0:2 minuten
Form_Load duurde: 0:1 minuten
De volgende stap is om meetfouten uit te sluiten. Daarvoor maken we gebruik van een 'running average'. De gebruiker geeft aan over hoeveel records (bijv. 4) en de applicatie gaat van record 1 tm 4 alle velden middelen, vervolgend 2 tm 5, enz.
Voordat dit gedaan kan worden moet de kolom met meetgegevens (tweede regel) worden opgesplitst in afzondelijke velden in de recordset.
Omdat aan een geopende recordset geen velden toegevoegd mogen worden, maak ik een nieuwe door de structuur van de orginele te nemen, de velden toe te voegen, vervolgens loop ik door de orginele recordset heen en voeg de waarden toe aan de nieuwe recordset. Dan ga ik naar de kolom waar alle meetgegevens in staat, splits die in afzondelijke waarden en vul die in in de nieuwe velden.
Dit is erg omslachtig en duurt ook lang:
splitsMeetgegevens duurde: 0:37 minuten
Nu heb ik dus een recordset van ca. 600 velden en 1600 records met alle data die ik nodig heb.
Op deze recordset ga ik de running average toepassen. Dit duurt nog veel langer:
berekenRunningAverage duurde: 2:46 minuten
En dan te bedenken dat 1600 records echt het minimum is, dit kan wel oplopen tot 20.000 records.
De oude programmatuur doet het min of meer op dezelfde wijze alleen dan niet in een recordset maar in een array en worden de meetgegevens niet gesplitst maar blijft ook dat een array.
De totale duur van deze 1600 records in het oude progamma is ca. 10 seconden.
Graag verneem ik waar ik de fout in ben gegaan en of er andere manieren zijn om dit op te lossen.
Overschakelen op een andere programmeertaal dan VB6sp6 is geen optie.
Daar heb ik al menig post over geschreven
Inmiddels is 80% klaar en moet ik tot mijn spijt betuigen dat ik waarschijnlijk totaal verkeerd bezig ben. De performance is nl. beroerd.
Als vergelijking heb ik het huidige programma dat in Delphi is geschreven. De reden dat we nu in VB6 bouwen is dat de kennis van Delphi inmiddels vertrokken is.
Ik zal eerst even in het kort uitleggen wat het programma moet doen.
We voeren meetwerk uit en die meetgegevens worden in tekstbestanden opgeslagen. Elke 20 minuten een nieuw bestand. De indeling van zo'n tekstbestand is eerst een regel met GPS-info, dan een regel met de meetgegevens. De verschillende gegevens zijn door ; gescheiden. De eerste regel bestaat uit 10 variabelen, de tweede uit 512 variabelen.
Doel van het programma is om de meetbestanden in te lezen, te tonen op het scherm (grafisch) zodat eventueel punten verwijderd kunnen worden. Vervolgens worden de meetgegevens (tweede regel) geanalyseerd. De uitkomst van die analyse bestaat uit 5 variabelen.
Deze 5 variabelen samen met de GPS-gegevens (eerste regel) worden het nieuwe databestand, maar nu deze gegevens op 1 regel en in Excel formaat.
Ik had bedacht om alle variabelen via in-memory recordsets (recordset zonder database-connectie) te benaderen.
Dus wat ik eerst doe is de meetbestanden inlezen in een recordset, maar daarbij de meetgegevens (tweede regel) in z'n geheel in een kolom, omdat ik op dit moment nog niets doe met die gegevens.
Vervolgens toon ik deze recordset in een MSFlexgrid en in een ActiveX-component die makkelijk GPS-data kan tonen.
De gebruiker kan nu punten verwijderen.
Performance is nog goed:
LeesOpgeslagenData duurde: 0:2 minuten
Form_Load duurde: 0:1 minuten
De volgende stap is om meetfouten uit te sluiten. Daarvoor maken we gebruik van een 'running average'. De gebruiker geeft aan over hoeveel records (bijv. 4) en de applicatie gaat van record 1 tm 4 alle velden middelen, vervolgend 2 tm 5, enz.
Voordat dit gedaan kan worden moet de kolom met meetgegevens (tweede regel) worden opgesplitst in afzondelijke velden in de recordset.
Omdat aan een geopende recordset geen velden toegevoegd mogen worden, maak ik een nieuwe door de structuur van de orginele te nemen, de velden toe te voegen, vervolgens loop ik door de orginele recordset heen en voeg de waarden toe aan de nieuwe recordset. Dan ga ik naar de kolom waar alle meetgegevens in staat, splits die in afzondelijke waarden en vul die in in de nieuwe velden.
Dit is erg omslachtig en duurt ook lang:
splitsMeetgegevens duurde: 0:37 minuten
Nu heb ik dus een recordset van ca. 600 velden en 1600 records met alle data die ik nodig heb.
Op deze recordset ga ik de running average toepassen. Dit duurt nog veel langer:
berekenRunningAverage duurde: 2:46 minuten
En dan te bedenken dat 1600 records echt het minimum is, dit kan wel oplopen tot 20.000 records.
De oude programmatuur doet het min of meer op dezelfde wijze alleen dan niet in een recordset maar in een array en worden de meetgegevens niet gesplitst maar blijft ook dat een array.
De totale duur van deze 1600 records in het oude progamma is ca. 10 seconden.
Graag verneem ik waar ik de fout in ben gegaan en of er andere manieren zijn om dit op te lossen.
Overschakelen op een andere programmeertaal dan VB6sp6 is geen optie.