Commit 8d1b776c by lvshi.gong

修改数据库处理方法

parent ea5b7910
#include "RamdomForestCalculate.h"
#include <QCoreApplication>
#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)
......@@ -13,13 +97,18 @@ RamdomForestCalculate::RamdomForestCalculate(QObject *parent)
m_tcpServerManager = new TcpServerManager(); // 实例化
m_tcpServerManager->startServer(2026);
dbFunc = new DBFunc(); // 实例化
dbFunc->startDBThread("RamdomForestFeatureValue");
//dbFunc = new DBFunc(); // 实例化
//dbFunc->startDBThread("RamdomForestFeatureValue");
//1.初始化分类器
Classifier = new RandomForestClassifier(10, 4);
//2.训练初始模型
//2.创建数据库表
CreatTable();
//3.训练初始模型
QString dbPath = QString("/home/pi/SigerTMS/stream/SAC/%1.db").arg("RamdomForestFeatureValue");
QList<SACRecord> record = queryRecordsByLabel(dbPath,0);
......@@ -32,6 +121,10 @@ RamdomForestCalculate::RamdomForestCalculate(QObject *parent)
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,
......@@ -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)
......@@ -81,6 +202,7 @@ void RamdomForestCalculate::SendStreamAlarminfo(const StreamInfo &alarmInfo)
message["target"] = alarmInfo.target;
message["startIds"] = alarmInfo.startIds;
message["endIds"] = alarmInfo.endIds;
//message["power"] = alarmInfo.endIds;
client->sendMessage(message);
SPDLOG_LOGGER_DEBUG(spdlog::get("logger"),"发送给流式告警信息成功");
......@@ -105,50 +227,63 @@ QList<SACRecord> RamdomForestCalculate::queryRecordsByLabel(const QString &dbFil
{
QList<SACRecord> records;
// 建立数据库连接
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", "MyConnection");
db.setDatabaseName(dbFileName);
// ==== 1. 建立唯一连接名 ====
QString conn = QString("rf_query_%1_%2")
.arg((qulonglong)QThread::currentThreadId())
.arg(QDateTime::currentMSecsSinceEpoch());
if (!db.open()) {
qDebug() << "Database open failed:" << db.lastError().text();
return records;
}
{
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", conn);
db.setDatabaseName(dbFileName);
// 执行查询
QString sql = QString("SELECT * FROM RamdomForestFeatureValue WHERE Label != %1").arg(targetLabel);
QSqlQuery query(sql, db);
if (!db.open()) {
qDebug() << "Database open failed:" << db.lastError().text();
QSqlDatabase::removeDatabase(conn);
return records;
}
if (!query.isActive()) {
qDebug() << "Query failed:" << query.lastError().text();
db.close();
return records;
}
// PRAGMA(可选但推荐)
QSqlQuery prag(db);
prag.exec("PRAGMA journal_mode=WAL;");
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();
return records;
}
// 遍历结果
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();
qDebug()<<"x: "<<record.x;
qDebug()<<"-----------------";
records.append(record);
}
// ==== 4. 删除连接(必须先关闭再删除) ====
QSqlDatabase::removeDatabase(conn);
db.close();
return records;
}
int RamdomForestCalculate::Save_SACDATA(const Dc_SacData &sacdata)
{
std::array<std::vector<float>, 3> raw;
......@@ -200,9 +335,12 @@ int RamdomForestCalculate::Save_SACDATA(const Dc_SacData &sacdata)
}
}
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: 存入数据库
......@@ -219,10 +357,20 @@ int RamdomForestCalculate::Save_SACDATA(const Dc_SacData &sacdata)
.arg(z) // z 特征值
.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: 删除二进制文件
QFile::remove(FilePath);
//QFile::remove(FilePath);
return 0;
}
......@@ -291,4 +439,6 @@ void RamdomForestCalculate::Retrain()
DealRecord(record,FearValues,TypeValues);
Classifier->train(FearValues, TypeValues, 0.2f, 100);
SPDLOG_LOGGER_DEBUG(spdlog::get("logger"),"Begin Train RamdomForestModel");
}
......@@ -39,9 +39,10 @@ struct StreamInfo
QString target;
QString startIds;
QString endIds;
QString powerdatas;
StreamInfo(int a = 0, const QString& t = "", const QString& s = "", const QString& e = "")
: alarmtype(a), target(t), startIds(s), endIds(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),powerdatas(p)
{
}
......@@ -56,7 +57,8 @@ class RamdomForestCalculate : public QObject
public:
explicit RamdomForestCalculate(QObject *parent = nullptr);
//1.
//1.查询功率样本(废弃函数)
QString QueryPowerData(const StreamInfo& alarmInfo);
//2.发送给流式的消息
void SendStreamAlarminfo(const StreamInfo& alarmInfo);
......@@ -82,7 +84,7 @@ signals:
private:
//QString m_name;
DBFunc *dbFunc;
//DBFunc *dbFunc;
TcpServerManager *m_tcpServerManager;
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