Datensätze laden: Performance-Analyse

 
Loading Rows in Memory

Neulich wollte ich herausfinden, wie lange es dauert, tausende von Datensätzen in den Speicher zu laden und dort vorzuhalten.

Dazu habe ich zunächst eine funktionelle Klasse als Struct erstellt, in deren Instanzvariablen die Werte geladen werden. Ein Struct entspricht also einer Datenzeile, eine Instanzvariable einer Datenspalte. Hier ein Beispiel um die Bankleitzahlen-Datei der Deutschen Bundesbank einzulesen:

Functional Class: structBlz
  Instance Variables
   String: sBlz
   Number: nMerkmal
   String: sBezeichnung
   String: sPlz
   String: sOrt
   String: sKurzbezeichnung
   Number: nPan
   String: sBic
   String: sPrüfzifferBerechnung
   String: sDatensatzNummer
   String: sÄnderungskennzeichen
   Boolean: bBankleitzahlLöschung
   String: sNachfolgeBankleitzahl

Die Datenzeilen wurden in einer weiteren funktionellen Klasse  namens listBlz geladen und im Speicher als dynamisches Array abgelegt. Die Listklasse enthält zwei Methoden: Add(structBlz) fügt eine Datenzeile im dynamischen Array an. Load() lädt die Tab getrennt Bankleitzahlendatei, die knapp 20.000 Datenzeilen enthält.

Functional Class: listBlz
  Instance Variables
    structBlz: __acBlz[*]
    Number: __nLength
  Functions
    Function: Add
      Returns Boolean:
      Parameters
        structBlz: cBlz
      Actions
        Set __acBlz[__nLength] = cBlz
        Set __nLength = __nLength + 1
    Function: Load
      Returns Boolean:
      Parameters
        String: sPathFile
      Local variables
        File Handle: hFile
        String: sLine
        structBlz: cBlz
        String: asTokens[*]
      Actions
        Call SalStrSetBufferLength( sLine, 1024 )
        If ( SalFileOpen( hFile, sPathFile, OF_Read ) )
          While ( SalFileGetStr( hFile, sLine, 1024 ) )
            SalStrTokenize( sLine, '', ' ', asTokens )
            Set cBlz = new structBlz
            Set cBlz.sBlz = asTokens[0]
            Set cBlz.nMerkmal = SalStrToNumber(asTokens[1])
            Set cBlz.sBezeichnung = asTokens[2]
            Set cBlz.sPlz = asTokens[3]
            Set cBlz.sOrt = asTokens[4]
            Set cBlz.sKurzbezeichnung = asTokens[5]
            Set cBlz.nPan = SalStrToNumber( asTokens[6] )
            Set cBlz.sBic = asTokens[7]
            Set cBlz.sPrüfzifferBerechnung = asTokens[8]
            Set cBlz.sDatensatzNummer = asTokens[9]
            Set cBlz.sÄnderungskennzeichen = asTokens[10]
            Set cBlz.bBankleitzahlLöschung = SalStrToNumber( asTokens[11] )
            Set cBlz.sNachfolgeBankleitzahl = asTokens[12]
            Call Add(cBlz)
          Call SalFileClose( hFile )

Das Laden der knapp 20.000 tausend Datensätze in den Speicher dauert erwas weniger als eine Sekunde. Probehalber habe ich auf Tokenize verzichtet und die gesamte Datenzeile in cBlz.sBlz gespeichert, womit man bei 0,4 Sekunden landet. Die meiste Zeit geht hier also für SalStrTokenize drauf.  Vermutlich wäre es also besser, ein Datenformat mit fester Feldlänge zu verwenden.

Loading Rows in Memory

Lädt man Daten aus einer Datenbank, kommt man auf eine ähnliche Performance. Man kann in etwa 20.000 Datensätze (mit etwa 10-15 Spalten) in einer halben Sekunde in den Speicher laden. Das ist viel schneller, als Daten in eine ChildTable zu laden. Das eröffnet uns interessante Möglichkeiten, die ich im nächsten Blog aufzeigen möchte.

Advertisements

Über thomasuttendorfer
Ich bin Entwicklungsleiter bei der Softwarefirma [ frevel & fey ] in München. Wir entwickeln Business-Software für Verlage und verwenden dafür den Gupta Team-Developer sowie Visual Studio.

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s

%d Bloggern gefällt das: