Seite 1 von 2

Datenbank: Grosse .csv einfügen beschleunigen ?

Verfasst: 24.08.2017 12:15
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.)

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

Verfasst: 24.08.2017 12:23
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

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

Verfasst: 24.08.2017 12:36
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 ?

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

Verfasst: 24.08.2017 12:38
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

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

Verfasst: 24.08.2017 12:40
von Bisonte
Ah mein edit hat sich überschnitten ;)

Wie führe ich denn etwas per PB in der "SQLLite Shell" aus ?

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

Verfasst: 24.08.2017 12:41
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

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

Verfasst: 24.08.2017 12:47
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 ....

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

Verfasst: 24.08.2017 13:06
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.

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

Verfasst: 24.08.2017 13:10
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 :)

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

Verfasst: 24.08.2017 13:20
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