Seite 1 von 1

CSV => SQLite Imoptgeschwindigkeit

Verfasst: 21.02.2009 10:30
von walter741
Guten morgen an alle Helfer in der Not
und an alle "Nur Leser"

Mache gerade meine ersten "Gehversuche" mit SQLite.

Um eine Fette Datenbank zu erhalten, importiere ich eine
*.CSV Datei in meine SQLite DB.
1000 Zeilen mit je 8 Reihen. Nur Text
Das funktioniert auch sehr gut mit diesem Code-Teil:

Code: Alles auswählen

If ReadFile(1, "c:\000elektor.csv")
          StartTime = ElapsedMilliseconds()
     
     For a=1 To 1000
          EineZeile.s=ReadString(1)
          T1.s="'"+StringField(EineZeile, 6, ";")+"'"
          T2.s="'"+StringField(EineZeile, 1, ";")+"'"
          T3.s="'"+StringField(EineZeile, 2, ";")+"'"
          T4.s="'"+StringField(EineZeile, 3, ";")+"'"
          T5.s="'"+StringField(EineZeile, 5, ";")+"'"
          T6.s="'"+StringField(EineZeile, 8, ";")+"'"
          T7.s="'"+StringField(EineZeile, 4, ";")+"'"
          T8.s="'"+StringField(EineZeile, 7, ";")+"'"
          
          DatabaseUpdate(DB, "INSERT INTO Tabelle1 Values ("+T1+","+T2+","+T3+","+T4+","+T5+","+T6+","+T7+","+T8+")") 
     Next a
          Debug ElapsedMilliseconds()-StartTime 
     
     CloseFile(1)
EndIf

Allerdings braucht das seine Zeit:
1000 Zeilen von CSV nach SQLite => 36sec
Meine voraussichtlich benötigten 107.000 Zeilen würden dann
bei einer satten Stunde liegen (Importierzeit).

Als Test habe ich die Codezeile "DatabaseUpdate(DB, xxxxxx)"
auskommentiert und bin auf eine Verarbeitungszeit
bei 1000 CSV-Zeilen von 16msec gekommen (DB ist natürlich leer).

Dem zufolge verbraucht die Codezeile "DatabaseUpdate(DB, xxxxxx)"
die meiste Zeit.

Kann man dagegen etwas machen ???
Kann man hier an der Speedschraube drehen ???
Für welche Datenmengen setzt man SQLite ein ???

Danke und Grüsse
Walter

Re: CSV => SQLite Imoptgeschwindigkeit

Verfasst: 21.02.2009 10:49
von Kiffi
eine Transaktion sollte Dein Problem lösen:

Code: Alles auswählen

If ReadFile(1, "c:\000elektor.csv")
     StartTime = ElapsedMilliseconds()
     ; Transaktionen beschleunigen Dateneinfügeoperationen *erheblich*
     DatabaseUpdate(DB, "Begin Transaction")  
     For a=1 To 1000
       [...] 
     Next a
     DatabaseUpdate(DB, "Commit")    
     Debug ElapsedMilliseconds()-StartTime 
     CloseFile(1)
EndIf
Grüße ... Kiffi

Verfasst: 21.02.2009 11:13
von walter741
Hallo Kiffi

Verdammt noch mal, ist das schnell.

Hätte es nicht für möglich gehalten, das zwei Code-Zeilen
so ein Ergebniss erzielen.

Vorher 1000 Zeilen 36 sec
und jetzt sind es nur noch 93msec.

Das ist Faktor 390.



Tausend Dank
Walter