Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
S
SigerCalculation
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
TCS-eConfigTool
SigerCalculation
Commits
8d1b776c
Commit
8d1b776c
authored
Dec 01, 2025
by
lvshi.gong
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
修改数据库处理方法
parent
ea5b7910
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
177 additions
and
25 deletions
+177
-25
RamdomForestCalculate.cpp
SigerCalculation/RadomForestSAC/RamdomForestCalculate.cpp
+171
-21
RamdomForestCalculate.h
SigerCalculation/RadomForestSAC/RamdomForestCalculate.h
+6
-4
No files found.
SigerCalculation/RadomForestSAC/RamdomForestCalculate.cpp
View file @
8d1b776c
#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.2
f
,
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,32 +227,40 @@ QList<SACRecord> RamdomForestCalculate::queryRecordsByLabel(const QString &dbFil
{
QList
<
SACRecord
>
records
;
// 建立数据库连接
QSqlDatabase
db
=
QSqlDatabase
::
addDatabase
(
"QSQLITE"
,
"MyConnection"
);
// ==== 1. 建立唯一连接名 ====
QString
conn
=
QString
(
"rf_query_%1_%2"
)
.
arg
((
qulonglong
)
QThread
::
currentThreadId
())
.
arg
(
QDateTime
::
currentMSecsSinceEpoch
());
{
QSqlDatabase
db
=
QSqlDatabase
::
addDatabase
(
"QSQLITE"
,
conn
);
db
.
setDatabaseName
(
dbFileName
);
if
(
!
db
.
open
())
{
qDebug
()
<<
"Database open failed:"
<<
db
.
lastError
().
text
();
QSqlDatabase
::
removeDatabase
(
conn
);
return
records
;
}
// 执行查询
QString
sql
=
QString
(
"SELECT * FROM RamdomForestFeatureValue WHERE Label != %1"
).
arg
(
targetLabel
);
QSqlQuery
query
(
sql
,
db
);
// PRAGMA(可选但推荐)
QSqlQuery
prag
(
db
);
prag
.
exec
(
"PRAGMA journal_mode=WAL;"
);
prag
.
exec
(
"PRAGMA synchronous=NORMAL;"
);
prag
.
exec
(
"PRAGMA busy_timeout=3000;"
);
if
(
!
query
.
isActive
())
{
qDebug
()
<<
"Query failed:"
<<
query
.
lastError
().
text
();
db
.
close
();
return
records
;
}
// ==== 2. 执行查询 ====
QString
sql
=
QString
(
"SELECT * FROM RamdomForestFeatureValue WHERE Label != %1"
)
.
arg
(
targetLabel
);
if
(
!
query
.
exec
())
{
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
();
...
...
@@ -140,15 +270,20 @@ QList<SACRecord> RamdomForestCalculate::queryRecordsByLabel(const QString &dbFil
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
();
}
// ==== 4. 删除连接(必须先关闭再删除) ====
QSqlDatabase
::
removeDatabase
(
conn
);
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.2
f
,
100
);
SPDLOG_LOGGER_DEBUG
(
spdlog
::
get
(
"logger"
),
"Begin Train RamdomForestModel"
);
}
SigerCalculation/RadomForestSAC/RamdomForestCalculate.h
View file @
8d1b776c
...
...
@@ -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
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment