概述:
? 最近在项目中需要用到influxdb 数据库,当时使用了libcur库之后,插入数据的速度一直不太理想。 创建字表的速度 1W的话需要11Min,对于这样的时间完全达不到合格。经过研究进行了打包处理。
QT Creator的版 | 5.12.10 | 系统? | win10 64 | libcur版本 | 7_82_0 |
下面代码的这部分主要是用来在测试时,根据需要调整多线程的处理。
#include <iostream>
#include "InfluxDBFactory.h"
#include "Point.h"
#include <QString>
#include <iostream>
#include <QDebug>
#include <QDateTime>
#include <QThread>
#include <QThreadPool>
#include <QVector>
#include <QMutexLocker>
#include <QProcess>
#include "qtconcurrentrun.h"
//#include "unistd.h"
#include <curl/curl.h>
using namespace QtConcurrent;
using namespace influxdb;
const int nSheet = 10000;
static int nThreadCount = 1;
void functionRun(int begin , int end);
int main()
{
CURLcode globalInitResult = curl_global_init(CURL_GLOBAL_ALL);
if (globalInitResult != CURLE_OK) {
throw std::runtime_error(std::string("cURL init") + curl_easy_strerror(globalInitResult));
}
int pathc = nSheet / nThreadCount; // 每次的批数
for(int iIndex = 0; iIndex <=nThreadCount; iIndex ++) //线程的数量
{
int begin = iIndex *pathc;
int end = 0;
if((nSheet - begin) <= 0)
{
break;
}
if((nSheet - begin) > pathc )
{
end = begin + pathc;
}
else
{
end = nSheet;
}
if( iIndex == 0)
{
QString starttime = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");
qDebug()<<" the software start run, the time is " << starttime;
}
QFuture<void> fut1 = run(functionRun, begin,end);//线程的方式有问题
QThread::msleep(2);
}
getchar();
}
?线程函数,主要是在此函数中进行influxdb的操作。
void functionRun(int begin, int end)
{
std::string strSend = "";
auto influxdb1 = influxdb::InfluxDBFactory::Get("http://wtw:123456@localhost:8086/?db=base");
QString strDatetime = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");
qDebug() << "begin is " << begin << " the end is " << end << " the start time is " << strDatetime;
{
for( int iIndex = begin; iIndex < end; iIndex ++)
{
QString strSheetName = "";
strSheetName.sprintf("sheet_%05d", iIndex );
QString tag1 = QString("%1%2").arg("localhost").arg(iIndex);
QString tag2 = QString("%1%2").arg("china").arg(iIndex);
strSend += Point{ strSheetName.toStdString().c_str()}
//.addTag("idcode",tag1.toStdString().c_str())
.addField("value", tag2.toStdString().c_str()).toLineProtocol();
// .addTag("host", "localhost")
// .addTag("region", "china")
// .addField("north_latitude", iIndex)
// .addField("east_longitude", iIndex).toLineProtocol();
strSend += '\n';
}
influxdb1->writeMulString(strSend.c_str());
}
QString strDatetimeE = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");
qDebug() << "begin is " << begin << " the end is " << end << " the end time is " << strDatetimeE;
}
?经过调整该程序, 建表的操作10W的操作只需要4s,如果有需要该代码已经上传到。资源地址
|