Ich hab da noch mehr Experimente angestellt...
Also Kiffi's Aussage stimmt. Es tut sich doch was, ich habs nur "noch" nicht gesehen.
Da ich aber dem User nicht zumuten kann, auf ein Fenster zu starren wo nichts passiert, habe ich
in Schritten das BEGIN und COMMIT eingeleitet. Also alle 250000 Zeilen. Dann kann man tatsächlich sehen
das etwas passiert. Ich hab das ganze natürlich in einem Thread laufen und schicke den aktuellen "Zeilenstand"
per PostEvent zum Fenster (ein ProgressBar-, und ein TextGadget).
Ich spiele noch mit der Zeilen-Anzahl, wo ein schreiben ins File stattfinden soll, aber bisher klappt das ganz gut.
Dauert zwar immer noch bei weitem länger als der Import mit der SQLiteShell, aber es klappt
@bobobo:
Das mit dem "PRAGMA journal_mode = MEMORY" werd ich mal testen, obwohl das wirklich nicht viel
bringen wird, ausser das die Platte weniger beschrieben wird. Das Journal nahm bei 250000 Einträgen immer nur 9KB
in Anspruch. Das DB File wuchs indes um 32 MB.
@Waldixxl:
Die Idee ist nicht schlecht, ich hab da nur ein Problem... Die Länge der Strings....
Ich habe eine Konstante, der ich den "INSERT INTO" String zugewiesen habe.
Code: Alles auswählen
#xSQL = "INSERT INTO systems(" +
"id, " +
"edsm_id, " +
"name, " +
"x, " +
"y, " +
"z, " +
"population, " +
"is_populated, " +
"government_id, " +
"government, " +
"allegiance_id, " +
"allegiance, " +
"state_id, " +
"state, " +
"security_id, " +
"security, " +
"primary_economy_id, " +
"primary_economy, " +
"power, " +
"power_state, " +
"power_state_id, " +
"needs_permit, " +
"updated_at, " +
"simbad_ref, " +
"controlling_minor_faction_id, " +
"controlling_minor_faction, " +
"reserve_type_id, " +
"reserve_type) VALUES (" +
"?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"
Ich finde diesen String schon extrem lang, aber er ist "fest", was mir das eintragen in die DB dank
SetDataBaseString() erleichtert.
Die Thread Prozedur sieht momentan so aus :
Code: Alles auswählen
; Lines.s() = Linklist (eine Zeile der CSV Datei)
; Es sind momentan 12.653.802 Listeneinträge mit 28 Elementen, durch "," getrennt
; CHR(34) soll dabei entfernt werden (es sind Namen dabei)
; Counter = Zähler für ProgressBar Fortschritt
; C2 = Zähler für Datenbank Zugriff
; i = Index Zähler für SetDataBaseString()
; DB\ = Mein eigenes SQLite DB Interface
; #xSQL = Konstante die den SQL INSERT INTO String enthält
Procedure.i Thread2(d = 0)
Protected i, Counter, C2
DB\Update("BEGIN;") ; Entspricht DataBaseUpdate()
PostEvent(#ListEV, 0, 0, #Start, ListSize(Lines()))
ForEach Lines()
Counter + 1 : c2 +1
db\SetQuad(0, Val(StringField(Lines(), 1, ","))) ; Entspricht SetDatabaseQuad()
For i = 1 To 27
db\SetString(i, RemoveString(StringField(Lines(), i + 1, ","), Chr(34))) ; Entspricht SetDatabaseString()
Next i
If Not DB\Update(#xSQL) ; Entspricht DataBaseUpdate()
Debug DB\LastError() ; Entspricht DataBaseError()
EndIf
If C2 => 250000
DB\Update("COMMIT;") ; Entspricht DataBaseUpdate()
C2 = 0
DB\Update("BEGIN;") ; Entspricht DataBaseUpdate()
EndIf
PostEvent(#ListEV, 0, 0, #Loc, Counter)
Next
DB\Update("COMMIT;") ; Entspricht DataBaseUpdate()
Delay(100)
PostEvent(#ListEV, 0, 0, #Stop, Counter)
EndProcedure
Edit : Die Tests mit der Erhöhung der Einträge, bevor sie in das Datenbankfile geschrieben werden, hat einen
verlangsamenden Effekt. Messungen : 500k Einträge ca. 9,7 Minuten 1Mio Einträge circa 10,6 Minuten
Das ganze gemessen ohne Debugger... Also das war eher ein Schuss in die falsche Richtung...