Datenbank: Grosse .csv einfügen beschleunigen ?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Bisonte
Beiträge: 2427
Registriert: 01.04.2007 20:18

Datenbank: Grosse .csv einfügen beschleunigen ?

Beitrag von Bisonte »

Hallo.

Ich habe hier eine verdammt grosse csv Datei (15 GB), die ich in eine SQLite DB überführen möchte.

Hierzu lese ich die Datei Zeile für Zeile aus und füge per "INSERT INTO" diese Zeile in die Tabelle ein.

Kann man das irgendwie beschleunigen, weil man kann zusehen, wie im Explorer die Dateigrösse immer nur um einige
Bytes grösser wird.

Ein "BEGIN" vor der "INSERT" Ausführung und ein "COMMIT" danach bringt irgendwie nichts...

Ich mache das testweise gerade mit einer csv Datei die "nur" 1,5GB hat, bevor ich die 15GB Datei anvisiere ;)

(Für die Interessierten : Es handelt sich um die frei zugänglichen Systemdaten des Spiels "Elite Dangerous" die hier zu finden sind.)
PureBasic 6.04 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Datenbank: Grosse .csv einfügen beschleunigen ?

Beitrag von RSBasic »

Ich würde eine große Datei niemals zeilenweise laden. Das dauert immer am längsten.
Ich würde diese Datei in mehreren Teile (á 1-8 GB, jenachdem wie viel Arbeitsspeicher du frei hast) splitten und diese mit ReadData() auf einmal laden.
Oder dauert das Inserten ebenfalls lange?

Oder du verwendest ein fertiges Konvertierungsprogramm aus dem Internet.

\\Edit:
Geht auch einfacher: https://www.sqlite.org/cvstrac/wiki?p=ImportingFiles
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Bisonte
Beiträge: 2427
Registriert: 01.04.2007 20:18

Re: Datenbank: Grosse .csv einfügen beschleunigen ?

Beitrag von Bisonte »

Das in den Speicher per Linklist zu knallen, dauert bei 1,5 GB ca 40-45 sekunden. das ist vertretbar....
Das "INSERT" dauert so lange. Egal ob die DB im Speicher (":memory:") oder als File auf der Platte ist.
Die nehmen sich beide nichts.

Momentan läuft das Programm was ich schrieb und er ist nach ca 15 Minuten erst bei knapp 11MB Datenbankgrösse....
(Ausgerechneterweise werden das ca. 1,7 GB)

Daher ist nun die Frage, bevor ich an die 15GB csv Datei rangehe, ob man das etwas schneller gestalten kann.
In der Hoffnung das irgendwelche SQL Anweisungen das beschleunigen können.

Edit:
For simple CSV files, you can use the SQLite shell to import the file into your SQLite database. First create the table, then designate the separator, and finally import the file.

sqlite> create table test (id integer, datatype_id integer, level integer, meaning text);
sqlite> .separator ","
sqlite> .import no_yes.csv test
Klingt ja interessant, aber wie mache ich das in PB ? Also die "SQLite shell" benutzen ?
Zuletzt geändert von Bisonte am 24.08.2017 12:39, insgesamt 1-mal geändert.
PureBasic 6.04 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Datenbank: Grosse .csv einfügen beschleunigen ?

Beitrag von RSBasic »

Bisonte hat geschrieben:Daher ist nun die Frage, bevor ich an die 15GB csv Datei rangehe, ob man das etwas schneller gestalten kann.
In der Hoffnung das irgendwelche SQL Anweisungen das beschleunigen können.
RSBasic hat geschrieben:Geht auch einfacher: https://www.sqlite.org/cvstrac/wiki?p=ImportingFiles
Du kannst versuchen, in der SQLLite-Shell folgendes auszuführen:

Code: Alles auswählen

sqlite> create table test (id integer, datatype_id integer, level integer, meaning text);
sqlite> .separator ","
sqlite> .import no_yes.csv test
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Bisonte
Beiträge: 2427
Registriert: 01.04.2007 20:18

Re: Datenbank: Grosse .csv einfügen beschleunigen ?

Beitrag von Bisonte »

Ah mein edit hat sich überschnitten ;)

Wie führe ich denn etwas per PB in der "SQLLite Shell" aus ?
PureBasic 6.04 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Datenbank: Grosse .csv einfügen beschleunigen ?

Beitrag von RSBasic »

Du lädst die Shell runter und führst ohne PB die Befehle aus. Oder willst du das unbedingt mit PB machen?

\\Edit:
Ja, dein Edit habe ich nach meinem Posting auch gesehen. Wir sind beide zu schnell :D
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Bisonte
Beiträge: 2427
Registriert: 01.04.2007 20:18

Re: Datenbank: Grosse .csv einfügen beschleunigen ?

Beitrag von Bisonte »

Eigentlich wollte ich das in PB machen, damit sich das der Nutzer diese Datenbank selbst anlegen kann...

Weil ich nicht wirklich die Möglichkeit habe irgendwo 15GB oder mehr zu hosten.

Und noch ein Edit:

SQLite Shell runtergeladen, mit den Werten eingegeben... Dauer des imports ca 2 Min. bei den 1,5 GB.
Also ist es möglich ;) Jetzt müsste man nur noch wissen, wie die Shell das importiert ....
PureBasic 6.04 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Datenbank: Grosse .csv einfügen beschleunigen ?

Beitrag von RSBasic »

Du kannst beispielsweise eine Textdatei für die Befehle vorbereiten, die du einfach zur Shell-Konsole umleitest:

Code: Alles auswählen

...\sqlite3.exe < D:\command.txt
Dann kannst du das in deiner PB-Anwendung ausführen.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: Datenbank: Grosse .csv einfügen beschleunigen ?

Beitrag von GPI »

Bisonte hat geschrieben:Also ist es möglich ;) Jetzt müsste man nur noch wissen, wie die Shell das importiert ....
Vermutlich über interne funktionen, auf die man in PB keinen Zugriff hat. Also nicht über das SQL-Interface.

15GB an Daten zu importieren ist auch eine Hausnummer :)
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Benutzeravatar
Bisonte
Beiträge: 2427
Registriert: 01.04.2007 20:18

Re: Datenbank: Grosse .csv einfügen beschleunigen ?

Beitrag von Bisonte »

GPI hat geschrieben:15GB an Daten zu importieren ist auch eine Hausnummer :)
Das ist wohl wahr....

Allerdings sind das "nur" die erforschten Systeme in dem Spiel. Es handelt sich dabei wohl so um vielleicht 1-2% wenn
ich das mal vorsichtig schätze, sehr weit aus dem Fenster gelehnt :mrgreen:

Die Macher haben wohl bei der prozeduralen Systemerstellung die Abbruchbedingungen falsch eingebaut ... Endlosschleife :D
PureBasic 6.04 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
Antworten