Commit 8d1b776c by lvshi.gong

修改数据库处理方法

parent ea5b7910
#include "RamdomForestCalculate.h" #include "RamdomForestCalculate.h"
#include <QCoreApplication> #include <QCoreApplication>
#include "spdlog/spdlog.h" #include "spdlog/spdlog.h"
#include <QFileInfo>
void CreatTable()
{
QString dbPath = QString("/home/pi/SigerTMS/stream/SAC/%1.db")
.arg("RamdomForestFeatureValue");
// 判断数据库文件是否存在
QFileInfo fi(dbPath);
if (!fi.exists()) {
qDebug() << "Database not exists. Creating...";
// ---- 短连接:打开 -> 执行建表语句 -> 关闭 ----
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", "InitConnection");
db.setDatabaseName(dbPath);
if (!db.open()) {
qDebug() << "Create DB failed:" << db.lastError().text();
return;
}
QString createTable = QString(
"CREATE TABLE IF NOT EXISTS RamdomForestFeatureValue("
"id INTEGER PRIMARY KEY AUTOINCREMENT, "
"StartTime TEXT NOT NULL, "
"EndTime TEXT NOT NULL, "
"target TEXT NOT NULL, "
"Label INTEGER NOT NULL, "
"x TEXT NOT NULL, "
"y TEXT NOT NULL, "
"z TEXT NOT NULL, "
"created_at TEXT DEFAULT CURRENT_TIMESTAMP)"
);
QSqlQuery query(db);
if (!query.exec(createTable)) {
qDebug() << "Create table error:" << query.lastError().text();
}
db.close();
QSqlDatabase::removeDatabase("InitConnection");
qDebug() << "Database and table created.";
}
}
bool execShortConn(QString sql, const QString &dbFile)
{
// 生成唯一连接名
QString conn = QString("short_%1_%2")
.arg((qulonglong)QThread::currentThreadId())
.arg(QDateTime::currentMSecsSinceEpoch());
bool ok = false;
{
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", conn);
db.setDatabaseName(dbFile);
if (!db.open()) {
qWarning() << "open failed:" << db.lastError();
QSqlDatabase::removeDatabase(conn);
return false;
}
// WAL & busy_timeout 可提升稳定性
QSqlQuery prag(db);
prag.exec("PRAGMA journal_mode=WAL;");
prag.exec("PRAGMA synchronous=NORMAL;");
prag.exec("PRAGMA busy_timeout=3000;");
QSqlQuery query(db);
ok = query.exec(sql);
if (!ok) {
qWarning() << "SQL ERROR:" << query.lastError();
}
db.close();
}
QSqlDatabase::removeDatabase(conn);
return ok;
}
//发送给流式的消息 //发送给流式的消息
RamdomForestCalculate::RamdomForestCalculate(QObject *parent) RamdomForestCalculate::RamdomForestCalculate(QObject *parent)
...@@ -13,13 +97,18 @@ RamdomForestCalculate::RamdomForestCalculate(QObject *parent) ...@@ -13,13 +97,18 @@ RamdomForestCalculate::RamdomForestCalculate(QObject *parent)
m_tcpServerManager = new TcpServerManager(); // 实例化 m_tcpServerManager = new TcpServerManager(); // 实例化
m_tcpServerManager->startServer(2026); m_tcpServerManager->startServer(2026);
dbFunc = new DBFunc(); // 实例化 //dbFunc = new DBFunc(); // 实例化
dbFunc->startDBThread("RamdomForestFeatureValue"); //dbFunc->startDBThread("RamdomForestFeatureValue");
//1.初始化分类器 //1.初始化分类器
Classifier = new RandomForestClassifier(10, 4); Classifier = new RandomForestClassifier(10, 4);
//2.训练初始模型
//2.创建数据库表
CreatTable();
//3.训练初始模型
QString dbPath = QString("/home/pi/SigerTMS/stream/SAC/%1.db").arg("RamdomForestFeatureValue"); QString dbPath = QString("/home/pi/SigerTMS/stream/SAC/%1.db").arg("RamdomForestFeatureValue");
QList<SACRecord> record = queryRecordsByLabel(dbPath,0); QList<SACRecord> record = queryRecordsByLabel(dbPath,0);
...@@ -32,6 +121,10 @@ RamdomForestCalculate::RamdomForestCalculate(QObject *parent) ...@@ -32,6 +121,10 @@ RamdomForestCalculate::RamdomForestCalculate(QObject *parent)
Classifier->train(FearValues, TypeValues, 0.2f, 100); Classifier->train(FearValues, TypeValues, 0.2f, 100);
} }
//GLS Test
StreamInfo info(1,"A$14$1$1$1$202$0","1764237011402-0","0");
SendStreamAlarminfo(info);
//连接信号和槽函数 //连接信号和槽函数
QObject::connect(m_tcpServerManager, &TcpServerManager::getdc_sacdata, QObject::connect(m_tcpServerManager, &TcpServerManager::getdc_sacdata,
...@@ -54,6 +147,34 @@ RamdomForestCalculate::RamdomForestCalculate(QObject *parent) ...@@ -54,6 +147,34 @@ RamdomForestCalculate::RamdomForestCalculate(QObject *parent)
//重新训练 //重新训练
}); });
}
QString RamdomForestCalculate::QueryPowerData(const StreamInfo &alarmInfo)
{
QString dbPath = QString("/home/pi/SigerTMS/stream/slice/slice_%1.db").arg(alarmInfo.target);
QString result = "";
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName(dbPath);
if (!db.open()) {
qDebug() << "无法打开数据库:" << db.lastError().text();
return result;
}
QSqlQuery query;
QString sql = QString("SELECT data FROM slice WHERE start_cursor = '%1'").arg(alarmInfo.startIds);
if (query.exec(sql) && query.next()) {
result = query.value(0).toString();
}
db.close();
return result;
} }
void RamdomForestCalculate::SendStreamAlarminfo(const StreamInfo &alarmInfo) void RamdomForestCalculate::SendStreamAlarminfo(const StreamInfo &alarmInfo)
...@@ -81,6 +202,7 @@ void RamdomForestCalculate::SendStreamAlarminfo(const StreamInfo &alarmInfo) ...@@ -81,6 +202,7 @@ void RamdomForestCalculate::SendStreamAlarminfo(const StreamInfo &alarmInfo)
message["target"] = alarmInfo.target; message["target"] = alarmInfo.target;
message["startIds"] = alarmInfo.startIds; message["startIds"] = alarmInfo.startIds;
message["endIds"] = alarmInfo.endIds; message["endIds"] = alarmInfo.endIds;
//message["power"] = alarmInfo.endIds;
client->sendMessage(message); client->sendMessage(message);
SPDLOG_LOGGER_DEBUG(spdlog::get("logger"),"发送给流式告警信息成功"); SPDLOG_LOGGER_DEBUG(spdlog::get("logger"),"发送给流式告警信息成功");
...@@ -105,50 +227,63 @@ QList<SACRecord> RamdomForestCalculate::queryRecordsByLabel(const QString &dbFil ...@@ -105,50 +227,63 @@ QList<SACRecord> RamdomForestCalculate::queryRecordsByLabel(const QString &dbFil
{ {
QList<SACRecord> records; QList<SACRecord> records;
// 建立数据库连接 // ==== 1. 建立唯一连接名 ====
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", "MyConnection"); QString conn = QString("rf_query_%1_%2")
db.setDatabaseName(dbFileName); .arg((qulonglong)QThread::currentThreadId())
.arg(QDateTime::currentMSecsSinceEpoch());
if (!db.open()) { {
qDebug() << "Database open failed:" << db.lastError().text(); QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", conn);
return records; db.setDatabaseName(dbFileName);
}
// 执行查询 if (!db.open()) {
QString sql = QString("SELECT * FROM RamdomForestFeatureValue WHERE Label != %1").arg(targetLabel); qDebug() << "Database open failed:" << db.lastError().text();
QSqlQuery query(sql, db); QSqlDatabase::removeDatabase(conn);
return records;
}
if (!query.isActive()) { // PRAGMA(可选但推荐)
qDebug() << "Query failed:" << query.lastError().text(); QSqlQuery prag(db);
db.close(); prag.exec("PRAGMA journal_mode=WAL;");
return records; prag.exec("PRAGMA synchronous=NORMAL;");
} prag.exec("PRAGMA busy_timeout=3000;");
// ==== 2. 执行查询 ====
QString sql = QString("SELECT * FROM RamdomForestFeatureValue WHERE Label != %1")
.arg(targetLabel);
QSqlQuery query(db);
if (!query.exec(sql)) {
qDebug() << "Query failed:" << query.lastError().text();
db.close();
QSqlDatabase::removeDatabase(conn);
return records;
}
// ==== 3. 遍历结果 ====
while (query.next()) {
SACRecord record;
record.startTime = query.value("StartTime").toString();
record.endTime = query.value("EndTime").toString();
record.target = query.value("target").toString();
record.label = query.value("Label").toInt();
record.x = query.value("x").toString();
record.y = query.value("y").toString();
record.z = query.value("z").toString();
records.append(record);
}
if (!query.exec()) {
qDebug() << "Query failed:" << query.lastError().text();
db.close(); db.close();
return records;
} }
// 遍历结果 // ==== 4. 删除连接(必须先关闭再删除) ====
while (query.next()) { QSqlDatabase::removeDatabase(conn);
SACRecord record;
record.startTime = query.value("StartTime").toString();
record.endTime = query.value("EndTime").toString();
record.target = query.value("target").toString();
record.label = query.value("Label").toInt();
record.x = query.value("x").toString();
record.y = query.value("y").toString();
record.z = query.value("z").toString();
qDebug()<<"x: "<<record.x;
qDebug()<<"-----------------";
records.append(record);
}
db.close();
return records; return records;
} }
int RamdomForestCalculate::Save_SACDATA(const Dc_SacData &sacdata) int RamdomForestCalculate::Save_SACDATA(const Dc_SacData &sacdata)
{ {
std::array<std::vector<float>, 3> raw; std::array<std::vector<float>, 3> raw;
...@@ -200,9 +335,12 @@ int RamdomForestCalculate::Save_SACDATA(const Dc_SacData &sacdata) ...@@ -200,9 +335,12 @@ int RamdomForestCalculate::Save_SACDATA(const Dc_SacData &sacdata)
} }
} }
double pred = Classifier->predict(test_sample); double pred = Classifier->predict(test_sample);
cout << "测试样本预测类别: " << pred << endl; //cout << "测试样本预测类别: " << pred << endl;
StreamInfo(pred,sacdata.target,sacdata.startIds,sacdata.endIds); SPDLOG_LOGGER_DEBUG(spdlog::get("logger"),"测试样本预测类别: {}",pred);
StreamInfo info(pred,sacdata.target,sacdata.startIds,sacdata.endIds);
SendStreamAlarminfo(info);
} }
//step3: 存入数据库 //step3: 存入数据库
...@@ -219,10 +357,20 @@ int RamdomForestCalculate::Save_SACDATA(const Dc_SacData &sacdata) ...@@ -219,10 +357,20 @@ int RamdomForestCalculate::Save_SACDATA(const Dc_SacData &sacdata)
.arg(z) // z 特征值 .arg(z) // z 特征值
.toStdString(); .toStdString();
dbFunc->addDataToQueue(data); QString dbPath = QString("/home/pi/SigerTMS/stream/SAC/%1.db")
.arg("RamdomForestFeatureValue");
QString sql = QString::fromStdString(data);
bool ok = execShortConn(sql, dbPath);
if (!ok) {
qWarning() << "Insert failed!";
}
//dbFunc->addDataToQueue(data);
//step4: 删除二进制文件 //step4: 删除二进制文件
QFile::remove(FilePath); //QFile::remove(FilePath);
return 0; return 0;
} }
...@@ -291,4 +439,6 @@ void RamdomForestCalculate::Retrain() ...@@ -291,4 +439,6 @@ void RamdomForestCalculate::Retrain()
DealRecord(record,FearValues,TypeValues); DealRecord(record,FearValues,TypeValues);
Classifier->train(FearValues, TypeValues, 0.2f, 100); Classifier->train(FearValues, TypeValues, 0.2f, 100);
SPDLOG_LOGGER_DEBUG(spdlog::get("logger"),"Begin Train RamdomForestModel");
} }
...@@ -39,9 +39,10 @@ struct StreamInfo ...@@ -39,9 +39,10 @@ struct StreamInfo
QString target; QString target;
QString startIds; QString startIds;
QString endIds; QString endIds;
QString powerdatas;
StreamInfo(int a = 0, const QString& t = "", const QString& s = "", const QString& e = "") StreamInfo(int a = 0, const QString& t = "", const QString& s = "", const QString& e = "",const QString& p = "")
: alarmtype(a), target(t), startIds(s), endIds(e) : alarmtype(a), target(t), startIds(s), endIds(e),powerdatas(p)
{ {
} }
...@@ -56,7 +57,8 @@ class RamdomForestCalculate : public QObject ...@@ -56,7 +57,8 @@ class RamdomForestCalculate : public QObject
public: public:
explicit RamdomForestCalculate(QObject *parent = nullptr); explicit RamdomForestCalculate(QObject *parent = nullptr);
//1. //1.查询功率样本(废弃函数)
QString QueryPowerData(const StreamInfo& alarmInfo);
//2.发送给流式的消息 //2.发送给流式的消息
void SendStreamAlarminfo(const StreamInfo& alarmInfo); void SendStreamAlarminfo(const StreamInfo& alarmInfo);
...@@ -82,7 +84,7 @@ signals: ...@@ -82,7 +84,7 @@ signals:
private: private:
//QString m_name; //QString m_name;
DBFunc *dbFunc; //DBFunc *dbFunc;
TcpServerManager *m_tcpServerManager; TcpServerManager *m_tcpServerManager;
RandomForestClassifier* Classifier; RandomForestClassifier* Classifier;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment