Große Datenmenge aus csv in Datenbank lesen

Datenbanklösungen mit AOO/LO

Moderator: Moderatoren

Gabriel123
***
Beiträge: 65
Registriert: Mo, 14.01.2008 19:31

Große Datenmenge aus csv in Datenbank lesen

Beitrag von Gabriel123 »

Hallo,

ich habe vor eine csv Datei mit ca. 150.000 Datensätzen in eine Datenbank zu bekommen. Bisher habe ich den Import in eine HsqlDB über einen Texttable gemacht. Also Daten aus der datei in ein Texttable geladen und von dort in meine Tabelle. Bei vielen Daten kommt es aber dann irgendwann zum crash weil der TextTable immer im Cache gespeichert wird. Habe versucht mit cache_scale zu arbeiten aber auch das ergab nichts.

Hat jemand schon mal mit so großen daten gearbeitet? Ich hatte schon versucht die csv Datei als Quelle zu verknüpfen. das geht auch aber dann kann ich nicht drin schreiben und auch keine weiteren Tabellen in dieser Db anlegen.

2 Ideen habe ich ungefähr:
1. csv Datei Zeilenweise auslesen und zeile für Zeile in die Tabelle der DB schreiben.
2. Datenbank1 mit der csv Datei als Quelle verknüpfen. Aus Datenbank2 auf Tabelle in Datenbank1 zugreifen und zeilenweise übertragen.

Ideen? DANKE!=)
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Große Datenmenge aus csv in Datenbank lesen

Beitrag von komma4 »

2.:
hört sich gut an
[vielleicht geht das in einem Rutsch: INSERT into hsql.tabelle ( col1, col2, ..., colX ) VALUES (SELECT * FROM csv.tabelle ) ]

3. die CSV-Quelle mit einem geeigneten CSV-Editor in "handliche" Häppchen zerlegen. Unter Windows evtl. CSVed

Was "handlich" ist - bestimmt Arbeitsspeicher des Rechners und Datensatz-Länge. Bekommst Du schnell durch Versuche heraus (5,10,20,50...tausend)

Viel Erfolg!


PS: Du hast meine Frage noch nicht beantwortet: hast Du einen HSQLDB-Server laufen...? Ich frage auch hier, weil:
die Daten sind in einem Base.odb Dokument ja eingebettet, wenn die interne HSQLDB engine genutzt wird. 150k records könnten sich da auch schnell unangenehm bemerkbar machen. Keine Ahnung: ich habe auf dem Feld noch keine Experimente gemacht,
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
Gabriel123
***
Beiträge: 65
Registriert: Mo, 14.01.2008 19:31

Re: Große Datenmenge aus csv in Datenbank lesen

Beitrag von Gabriel123 »

Also ich habe eine normale HSQLDB angelegt über den Open Office Base Wizard. Mit MySQL DBs habe ich noch nie gearbeitet, deshalb weiss ich nicht ob mir ein schneller Umstieg gelingen würde. Aber ich werde mich mal nach Infos umschauen wie man eine MySQL DB anlegt und nutzt...ist sicher um einiges schneller...
komma4 hat geschrieben:2.:
hört sich gut an
[vielleicht geht das in einem Rutsch: INSERT into hsql.tabelle ( col1, col2, ..., colX ) VALUES (SELECT * FROM csv.tabelle ) ]
Dein Beispiel geht scheinbar davon aus, dass Tabelle hsql.tabelle und csv.tabelle in der gleichen DB angelegt sind. Oder? Ich habe es bisher nie geschafft in einer DB, die mit einer csv Datei als Quelle verknüpft ist eine weitere Tabelle anzulegen! Ich brauche also die Möglichkeit tabelle1(mit csv verknüpft->nur lesezugriff) aus DB1 in Tabelle2 in DB2 zukopieren.

Die Datei zerstückeln hatte ich nicht vor, ich kann sie ohne Probleme mit dem Windows Standard editor öffnen! Mein Arbeitsspeicher sollte also damit klar kommen.
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Große Datenmenge aus csv in Datenbank lesen

Beitrag von komma4 »

Also, ich habe die MySQL Installation und Inbetriebnahme vor drei Wochen unter Windows XP in 15 bis 30 Minuten hinbekommen (inkl. Suchen eines Installationspaketes, Konfiguration und Verbindungsaufnahme von OOo über JDBC)...


Ja: ich dachte nicht daran, dass Du ja zwei Datenbanken hast.... Damit weiss ich nicht, ob eine Übertragung zustande kommen kann.

Und: Dein Hauptspeicher reicht aus, um die Daten in einem Editor anzuzeigen.
Das muss nicht heissen, dass OOo (und/oder) BASE das auch kann. Auch weiss ich nicht, in wie viele Transaktionen durch OOo ein solches Einlesen gesplittet wird....

...deshalb denke ich, dass momentan die einfachste Lösung ist:

Teile (die Daten) und (be-)Herrsche (die Datenbank)
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
Gabriel123
***
Beiträge: 65
Registriert: Mo, 14.01.2008 19:31

Re: Große Datenmenge aus csv in Datenbank lesen

Beitrag von Gabriel123 »

habe mir das besagte Programm mal angesehen. Leider kann es nur nach Spalten splitten. Eine Möglichkeit die csv der Länge nach zu splitten ist scheinbar nicht möglich....also so dass jede datei dann 50.000 datensätze enthält oder so.
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Große Datenmenge aus csv in Datenbank lesen

Beitrag von komma4 »

Nehme Deinen "Standard-Editor unter Windows" und teile bei Zeile 30000, 60000, usw. ...

Notepad zeigt Dir eine Zeilenanzahl an (Ansicht>Statusleiste)...
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
Gabriel123
***
Beiträge: 65
Registriert: Mo, 14.01.2008 19:31

Re: Große Datenmenge aus csv in Datenbank lesen

Beitrag von Gabriel123 »

Also das mit dem csv Datei Stücken war nicht so toll aber ich hab mir was zusammengebastelt was per schleife zeilenweise überträgt und so den Arbeitsspeicher in Ruhe lässt! Dauert zwar ein wenig aber so einen import macht man ja nicht alle Tage=)

Code: Alles auswählen

sub import
DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
DataSource = DatabaseContext.getByName("import")
Statement = Connection.createStatement()
iNumber = Freefile
aFile = "c:/analyse/04imp.csv" 'oControl.Text

Open aFile For Input As iNumber
While not eof(iNumber)

Input #iNumber, s01, s02
ResultSet = Statement.executeQuery("INSERT INTO ""Table""(""01"",""02"") VALUES('" & s01 & "','" & s02 & "')"
wend
Close #iNumber
end sub 
Antworten