MySQL Datenbanken füllen mit CPP Connector
-
Hi,
ich würde gerne wahnsinnig viele Daten (~2-8 GB) in eine SQL Datenbank schreiben, damit beim laufenden Prozess die Tabelle nicht komplett in den Arbeitsspeicher geladen werden muss, das Abfragen der Daten darf ruhig ein paar Millisekunden dauern, da ist keine Eile.
Um das zu erreichen will ich die Daten erst komplett in den Speicher laden und dann in eine SQL Tabelle schreiben, das klappt auch wunderbar, aber das Programm verödet dabei quasi, bzw. selbst mit kleinen Datensätzen so 100 mb dauert es einfach wahnsinnig lange und ich möchte nicht erst in hundert Jahren fertig werden. Im Moment füge ich alle Einträge einzeln mit dem SQL C++ Connector Interface ein.
prep_stmt = con->prepareStatement("INSERT INTO " + state + " (id, d1, d2, d3) VALUES (?,?,?,?)"); prep_stmt->setInt(1,j); prep_stmt->setDouble(2,data1); prep_stmt->setDouble(3,data2); prep_stmt->setDouble(4,data3); prep_stmt->execute();
aber da ich mehrere hundert tausend bis Millionen Einträge habe dauert das einfach unermesslich lange.
Ich habe aber die Tabellen quasi schon komplett im Speicher, gibt es eine Möglichkeit sofort ganze Blöcke von Daten zu schreiben?
Vielen Dank!
-
Welches RSBMS?
-
MySQL 5.1
hab es wenigstens um den Faktor 10 verbessern können indem ich eine ganze Tabelle auf einmal anlege, da ich aber etwa 60000 Tabellen habe dauert das immer noch recht lange.stmt->execute("INSERT INTO " + state + " (id" +state_actions.str() +") VALUES " + sinsert.str());
Sind da noch irgendwelche Indexroutinen oder Fehleranalysen drin, die ich der Performance wegen abschalten kann?
-
Du könntest dir mal LOAD DATA INFILE anschauen. Wenn du die Daten in Speicher und nicht auf der Platte hast dann könntest du vllt in einer named pipe schreiben.
-
SmokinC schrieb:
MySQL 5.1
hab es wenigstens um den Faktor 10 verbessern können indem ich eine ganze Tabelle auf einmal anlege, da ich aber etwa 60000 Tabellen habe dauert das immer noch recht lange.stmt->execute("INSERT INTO " + state + " (id" +state_actions.str() +") VALUES " + sinsert.str());
Sind da noch irgendwelche Indexroutinen oder Fehleranalysen drin, die ich der Performance wegen abschalten kann?
60000 Tabellen . Also da ist definitiv ein Designfehler.
-
ich bins schrieb:
SmokinC schrieb:
MySQL 5.1
hab es wenigstens um den Faktor 10 verbessern können indem ich eine ganze Tabelle auf einmal anlege, da ich aber etwa 60000 Tabellen habe dauert das immer noch recht lange.stmt->execute("INSERT INTO " + state + " (id" +state_actions.str() +") VALUES " + sinsert.str());
Sind da noch irgendwelche Indexroutinen oder Fehleranalysen drin, die ich der Performance wegen abschalten kann?
60000 Tabellen . Also da ist definitiv ein Designfehler.
Eher ein Tippfehler es sind 6000 ^^
-
Für sowas wurde MySQL nie gebaut.
Es gibt nicht umsonst Kostenpflichtige RDBMS.6000 Datenbanken anlegen ist für MySQL nicht so einfach denn es sind 6000x3 Dateien die erstellt werden müssen.
Da ist nichts mit Millisekunden.