2017-09-05 116 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分钟。 –