Textdatei in Datenbank ( über Arbeitsspeicher )

Anfängerfragen zum Programmieren mit PureBasic.
Hermann
Beiträge: 31
Registriert: 09.09.2004 23:01
Wohnort: Willich

Textdatei in Datenbank ( über Arbeitsspeicher )

Beitrag von Hermann »

Hallo zusammen.

Leider habe ich zu meinem Problem nichts gefunden.

Problem:
Ich will eine Textdatei zeilenweise in eine Datenbank ( SQLite ) kopieren. Hierzu lese ich die Textdatei zeilenweise aus ( Fasttext ) und schreibe die Zeile dann als Datensatz in die Datenbank. Soweit klappt das auch. Nun dauert dieser Vorgang jedoch durch die Laufwerkszugriffe ellenlang.

Mein Gedanke war, die Textdatei in den Speicher zu laden, dort auslesen und dann in die Datenbank zu schreiben.

Leider habe ich keine Ahnung wie ich dieses bewerkstelligen kann :-(

Kann mir jemand einen Tip bzw. Anleitung geben?

Hier nun der Code wie ich es bislang mache :

Code: Alles auswählen

File$=OpenFileRequester("Datei öffnen:","","Text | *.txt",1)

FileOpened=ReadFile(1,File$)

LinesCount=FastOpenTextFile(File$) 
 ;MessageRequester("Test","Count lines :"+StrU(LinesCount,2),0)

If SQLiteOpen(Datenbanknummer.l,#Datenbankname)
  
  For i= 1 To LinesCount
    Textline.s = FastReadLine(i)
    abfrage1$ = "insert into Liste (Feld1,Feld2) "
    abfrage2$ = "values ('" + Str(i) + "','" +  Textline.s + "')"
    abfrage.s=abfrage1$+abfrage2$
    SQLiteExec(abfrage.s)
  Next
  
  SQLiteClose(Datenbanknummer.l)
  
  MessageRequester("Import abgeschlossen","Count lines :"+StrU(LinesCount,2),0)
  
EndIf
Danke für jede Hilfe.

Hermann
Benutzeravatar
FGK
Beiträge: 249
Registriert: 09.01.2005 14:02
Computerausstattung: i5-4430 CPU / 8GB RAM
GeForce GT630
Windows 10 Home / 64-bit
Wohnort: Augsburg

Beitrag von FGK »

Hallo Hermann,

mach aus deiner Textline.s ein Array und dimensionier es mit LinesCount.
Dann liest du alles in einem Rutsch ins Array und dann setzt du den Inhalt des Arrays wie bisher in deine Datenbank.

Gruß

FGK
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Textdatei in Datenbank ( über Arbeitsspeicher )

Beitrag von Kiffi »

Hallo Hermann,

Transaktionen beschleunigen Deine Datenbankanweisungen erheblich (in
Deinem Code mit drei Ausrufezeichen gekennzeichnet).

Code: Alles auswählen

File$=OpenFileRequester("Datei öffnen:","","Text | *.txt",1)

FileOpened=ReadFile(1,File$)

LinesCount=FastOpenTextFile(File$) 
 ;MessageRequester("Test","Count lines :"+StrU(LinesCount,2),0)

If SQLiteOpen(Datenbanknummer.l,#Datenbankname)
  
    SQLiteExec("BEGIN TRANSACTION;") ; !!!

  For i= 1 To LinesCount
    Textline.s = FastReadLine(i)
    abfrage1$ = "insert into Liste (Feld1,Feld2) "
    abfrage2$ = "values ('" + Str(i) + "','" +  Textline.s + "')"
    abfrage.s=abfrage1$+abfrage2$
    SQLiteExec(abfrage.s)
  Next
  
    SQLiteExec("COMMIT;") ; !!!

  SQLiteClose(Datenbanknummer.l)
  
  MessageRequester("Import abgeschlossen","Count lines :"+StrU(LinesCount,2),0)
  
EndIf
Grüße ... Kiffi
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

Außerdem wird es höchstens langsamer, wenn man die Zeilen, die man mit der FastFile-Lib ausliest nochmal in ein Array schreibt, weil die FastFile-Lib einfach nicht schneller zu machen ist. Sie holt schon alles an Geschwindigkeit heraus. Intern macht sie nämlich das, was du vorhast, und noch etwas mehr.
Hermann
Beiträge: 31
Registriert: 09.09.2004 23:01
Wohnort: Willich

Re: Textdatei in Datenbank ( über Arbeitsspeicher )

Beitrag von Hermann »

Kiffi hat geschrieben: Transaktionen beschleunigen Deine Datenbankanweisungen erheblich....
Danke. Das wars.

Liebe Grüße , Hermann
Antworten