2017-09-05 2 views
0

ich eine Anwendung in c haben ++ und ich bin mit der C++ MySQL Connector (https://dev.mysql.com/downloads/connector/cpp/)C++ in Legen Sie MySQL-Datenbank

Ich brauche einige Protokolle innerhalb eines table.Depending auf die Zeiten speichern ich große Mengen haben Daten in der Größenordnung von Tausenden (z. B. 80.000).

Ich implementiere bereits eine Funktion, die meine std::vector<std::string> iterieren und die std::string in meiner Datenbank speichern.

Zum Beispiel:

std::vector<std::string> lines = explode(filedata, '\n'); 
for (int i = 0; i < lines.size(); i++) 
{ 
    std::vector<std::string> elements = explode(lines[i], ';'); 
    ui64 timestamp = strtol(elements.at(0).c_str(), 0, 10); 
    std::string pointId = elements.at(6); 
    std::string pointName = elements.at(5); 
    std::string data = elements.at(3); 

    database->SetLogs(timestamp, pointId, pointName, data); 
} 

Die Protokolle kommen aus CSV-Datei, ich alle Felder meines Vektor speichern. Danach analysiere ich den Vektor (mit explode) und bekomme nur die Felder, die ich speichern muss.

Aber ich habe ein Problem. Wenn ich z. B. 80.000 habe, rufe ich meine Funktion auf, in Datenbank 80.000 zu speichern. Es funktioniert und speichert alle Daten korrekt, aber es braucht viel Zeit.

Existiert eine Möglichkeit, alle Daten nur einmal aufrufen die Funktion zu speichern, ohne z. B. 80.000 zu speichern und damit die Zeit zu optimieren?

EDIT 1

ich den Einsatz ändern Sie diesen Code auf:

std::string insertLog = "INSERT INTO Logs (timestamp,pointId,pointName,data) VALUES (?,?,?,?)"; 

    pstmt->setString(1, timestampString); 
    pstmt->setString(2, pointId); 
    pstmt->setString(3, pointName); 
    pstmt->setString(4, data); 
    pstmt->executeUpdate(); 
+0

Wenn der Code, den Sie haben, richtig funktioniert, und Sie nur die Leistung verbessern möchten: [codereview.stackexchange.com] (https://codereview.stackexchange.com/) ist besser, um solche Fragen zu stellen. –

+0

vielleicht suchen Sie für Gebäude Einfügen https://dev.mysql.com/doc/refman/5.5/en/optimizing-innodb-bulk-data-loading.html – sam

Antwort

0

Sie können den Code ändern Bulk-Einsätze zu tun, eher als eine Zeile zu einem Zeitpunkt einsetzen.

Ich würde es empfehlen, indem Sie eine Insert-Anweisung als Zeichenfolge erstellen und die Zeichenfolge an mysqlpp::Query übergeben. Ich erwarte, dass Sie eine vorbereitete Anweisung verwenden können, um Masseneinfügungen auf ähnliche Weise durchzuführen.

Wenn Sie eine Insert-Anweisung für jede Zeile (die ich hier den Fall mit explode() verwenden), denke ich, es gibt viel mehr Verkehr zwischen dem Client und dem Server, die Dinge verlangsamen müssen.

EDIT

Ich bezweifle die Funktion explode() für die Ausführungszeit zu erhöhen, wie Sie die Datei zweimal zugreifen, wenn Sie zweimal explodieren nennen. Es wäre schön, wenn Sie den Code für explode() erzeugen könnten.

+0

Vielen Dank für die Antwort. Bitte sehen Sie meine ursprüngliche Frage, ich füge ein "Edit 1" hinzu. Ich denke, jetzt ist es schneller mit dem neuen Code, aber wir verbringen 4 Minuten, um 55748 Register in der Datenbank zu speichern ... es ist nicht viel? – rrMM84

+0

Können Sie bitte die vorherige Matrix sagen? Die benötigte Zeit vorher? –

+0

4 Minuten kann noch optimiert werden, wenn Sie Ihre Logik verbessern, um die Anzahl der Dateizugriffe zu reduzieren. –

Verwandte Themen