Conversation
📊 性能对比(估算)
技术亮点
|
|
Thanks for this PR. By moving to an incremental save/SaveTodayOnly() approach, does this also improve data recovery or prevent file corruption after a crash? I frequently lose my historical data when the app crashes, as it stops reading the .dat file and resets the count. |
我有重新优化读取备份的逻辑,程序启动和退出,会重新检查 |
|
自从我提交这个PR以来,我就一直在使用这个优化后的功能,并且我部署在了三台win机器上, 看数据是正常的。 但是程序从休眠中唤醒的时候,仍有可能出现程序挂掉,我对这个现象并不感兴趣,手动重启程序就行了。 |
|
Thank you for your response. The crash scenario occurs as follows:
I will review the history and backup files to determine whether any relevant logs can be recovered. |
如果可以的话,你可以试试看我这个版本。 https://github.com/Yundi339/TrafficMonitor/actions/runs/21777997183 |
will try this, thanks! |


相关
#2225
我在排查磁盘健康寿命的时候,发现TrafficMonitor存在频繁写入磁盘的问题,虽然是30s写入一次,但是全量写入的机制,实际上不友好的。
提交目的
解决
history_traffic.dat文件频繁写入问题,通过引入增量保存机制,在保持数据安全性的前提下,大幅减少磁盘I/O操作。细节说明
1. 数据结构重构
(目的是减少代码的复杂度,不用每次都更新数组,直接链表进行维护)
m_today_traffic: 单独存储今天的记录(频繁更新)m_history_traffics: 历史记录链表(按日期从大到小排序,较少更新)m_traffics_cache: 缓存合并后的完整列表(按需更新)2. 新增增量保存机制
(这是我加入的核心功能,可以有效减少磁盘写入频率,原先的全量保存是写一点就触发一次缓冲区同步,对磁盘IO来说是很不友好的)
SaveTodayOnly()3. 保存策略优化
(原本是30s && 100kB 触发一次保存,现在增加更大的30s&&10MB)
频繁保存场景(流量变化超过10MB时):
SaveHistoryTraffic()→SaveTodayOnly()进行增量保存程序退出/系统关机场景:
SaveHistoryTrafficFull()→Save()进行完整保存4. 缓存机制
(简化代码复杂度)
m_cache_dirty标志,实现按需更新缓存GetTraffics()方法在缓存过期时自动更新5. 数据一致性保障
(简化代码复杂度)
IsTodayRecord()方法检查今天的记录日期是否正确OnDateChanged()将今天的记录移到历史记录MormalizeData()方法确保数据排序和去重影响分析
性能显著提升
磁盘寿命延长
数据安全性保持
文件格式兼容性
Load()方法保持向后兼容,能正确解析旧格式文件并发访问
文件损坏恢复
.bak文件)数据丢失风险