2017-09-05 130 views
0

我在C一個應用++和我使用的是C++ MySQL連接(https://dev.mysql.com/downloads/connector/cpp/c + +插入到MySQL數據庫

我需要保存一個table.Depending裏面的一些日誌的時候,我可能有大量的數據量爲數千(例如80,000)。

我已經實現了一個迭代我的std::vector<std::string>並將std::string保存到我的數據庫的函數。

例如:

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); 
} 

日誌來自csv文件,我的所有字段保存到我的向量。在此之後,我解析矢量(爆炸),並只得到我需要保存的字段。

但我有一個問題。如果我有例如80,000我打電話給我的函數保存在數據庫80,000。它可以正常工作並保存所有數據,但需要很長時間。

存在某種方式來保存所有數據只調用一次保存功能,而不調用例如80,000,從而優化時間?

編輯1

我改變插入的代碼如下:

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

如果您的代碼正常工作,並且您只想提高性能:[codereview.stackexchange.com](https://codereview.stackexchange.com/)是更好的地方提出這樣的問題。 –

+0

也許您正在尋找builk插件https://dev.mysql.com/doc/refman/5.5/en/optimizing-innodb-bulk-data-loading.html – sam

回答

0

你可以改變代碼來執行批量插入,而不是一次插入一行。

我建議通過生成插入語句作爲字符串並將字符串傳遞給mysqlpp::Query來執行此操作。我希望你可以使用準備好的語句以類似的方式進行批量插入。

如果每行(我假設這裏使用explode()的情況下),做一個INSERT語句中,我認爲有客戶端和服務器,必須慢下來之間多了很多流量。

編輯

我懷疑增加,你正在訪問的文件兩次當你調用兩次爆炸的執行時間的函數explode()。如果你能夠生成explode()的代碼將會很好。

+0

感謝您的回覆。請參閱我的原始問題,我添加了「編輯1」。我認爲現在用新代碼更快,但是我們花了4分鐘在數據庫中保存55748個寄存器......它很不? – rrMM84

+0

你能告訴前面的矩陣嗎?之前需要的時間? –

+0

如果您改善邏輯以減少文件訪問次數,仍然可以優化4分鐘。 –