Datenbank: Grosse .csv einfügen beschleunigen ?
Datenbank: Grosse .csv einfügen beschleunigen ?
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.)
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.10 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
Re: Datenbank: Grosse .csv einfügen beschleunigen ?
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
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 ?
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:
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:
Klingt ja interessant, aber wie mache ich das in PB ? Also die "SQLite shell" benutzen ?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
Zuletzt geändert von Bisonte am 24.08.2017 12:39, insgesamt 1-mal geändert.
PureBasic 6.10 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
Re: Datenbank: Grosse .csv einfügen beschleunigen ?
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.
Du kannst versuchen, in der SQLLite-Shell folgendes auszuführen:RSBasic hat geschrieben:Geht auch einfacher: https://www.sqlite.org/cvstrac/wiki?p=ImportingFiles
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 ?
Ah mein edit hat sich überschnitten
Wie führe ich denn etwas per PB in der "SQLLite Shell" aus ?
Wie führe ich denn etwas per PB in der "SQLLite Shell" aus ?
PureBasic 6.10 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
Re: Datenbank: Grosse .csv einfügen beschleunigen ?
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
\\Edit:
Ja, dein Edit habe ich nach meinem Posting auch gesehen. Wir sind beide zu schnell
Re: Datenbank: Grosse .csv einfügen beschleunigen ?
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 ....
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.10 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
Re: Datenbank: Grosse .csv einfügen beschleunigen ?
Du kannst beispielsweise eine Textdatei für die Befehle vorbereiten, die du einfach zur Shell-Konsole umleitest:
Dann kannst du das in deiner PB-Anwendung ausführen.
Code: Alles auswählen
...\sqlite3.exe < D:\command.txt
Re: Datenbank: Grosse .csv einfügen beschleunigen ?
Vermutlich über interne funktionen, auf die man in PB keinen Zugriff hat. Also nicht über das SQL-Interface.Bisonte hat geschrieben:Also ist es möglich Jetzt müsste man nur noch wissen, wie die Shell das importiert ....
15GB an Daten zu importieren ist auch eine Hausnummer
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Re: Datenbank: Grosse .csv einfügen beschleunigen ?
Das ist wohl wahr....GPI hat geschrieben:15GB an Daten zu importieren ist auch eine Hausnummer
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
Die Macher haben wohl bei der prozeduralen Systemerstellung die Abbruchbedingungen falsch eingebaut ... Endlosschleife
PureBasic 6.10 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