Loading Data to Memory: A Performance Analysis

Loading Rows in Memory

Recently I wanted to find out how long it takes to fetch thousands of records in memory.

So first I created a functional class as a struct in which instance variables the values are loaded. A struct is equivalent to a row of data. An instance variable is equivalent to a column. Here is an example data structure of the bank codes file of the Deutsche Bundesbank:
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
The rows of data were loaded into another functional class called listBlz and stored in the memory as a dynamic array. The list class has two methods: Add(structBlz) adds a data row in the dynamic array. The Load() method loads the tab separated bank code file that contains nearly 20,000 rows.
Functional Class: listBlz
  Instance Variables
    structBlz: __acBlz[*]
    Number: __nLength
    Function: Add
      Returns Boolean:
        structBlz: cBlz
        Set __acBlz[__nLength] = cBlz
        Set __nLength = __nLength + 1
    Function: Load
      Returns Boolean:
        String: sPathFile
      Local variables
        File Handle: hFile
        String: sLine
        structBlz: cBlz
        String: asTokens[*]
        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 )
Loading of around  20,000 records in the memory takes less than a second. To eliminate the effect of the tokenizer I stored the entire row of data in just on property cBlz.sBlz, which you arrive at 0.4 seconds. So most of the time is due to the use of SalStrTokenize. It would probably be better to use a fixed field length data format.

Loading Rows in Memory

Loading data from a database, you get a similar performance. You can fetch approximately 20,000 records (with approximately 10-15 columns) in a half-second. This is much faster than to load data into a ChildTable. This gives us interesting possiblilities which I want to show you in the next blog.

Ü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:


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


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


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: