使用DistinctUntilChanged时保留变更前最后一项以维持日志波形形状
日志条目压缩实现方案
核心逻辑
你需要在日志写入/过滤环节维护两个状态变量,确保数值跳变的边界被完整保留:
last_saved_val:上一次已写入日志的数值last_unsaved_entry:最新的未写入的重复数值条目(附带时间戳)
处理规则
每产生一条新日志条目时按以下流程处理:
- 首次写入时直接将当前条目写入日志,初始化两个状态变量
- 若当前数值和
last_saved_val相等:仅更新last_unsaved_entry为当前条目,不写入磁盘 - 若当前数值和
last_saved_val不相等:- 先将
last_unsaved_entry写入日志(即数值变更前的最后一条) - 再将当前新数值的条目写入日志
- 更新两个状态变量为当前数值和当前条目
- 先将
- 程序退出/日志滚动结束前,额外将当前的
last_unsaved_entry写入日志,避免最后一段连续重复值丢失
示例代码(Python)
# 初始化状态变量 last_saved_val = None last_unsaved_entry = None # 模拟日志写入方法,按需替换为你的实际写入逻辑 def write_to_log(entry): print(f"写入日志:{entry['timestamp']} | {entry['value']}") def filter_log_entry(current_entry): global last_saved_val, last_unsaved_entry # 首次写入处理 if last_saved_val is None: write_to_log(current_entry) last_saved_val = current_entry["value"] last_unsaved_entry = current_entry return # 重复值仅更新缓存 if current_entry["value"] == last_saved_val: last_unsaved_entry = current_entry return # 数值跳变处理 write_to_log(last_unsaved_entry) write_to_log(current_entry) last_saved_val = current_entry["value"] last_unsaved_entry = current_entry # 程序退出前调用,写入最后一段重复值 def on_shutdown(): if last_unsaved_entry is not None: write_to_log(last_unsaved_entry)
效果验证
原始时序数值示例:[0,0,0,5,5,5,3,3],对应时间戳t0~t7
过滤后保留的条目:(t0,0)、(t2,0)、(t3,5)、(t5,5)、(t6,3)、(t7,3)
绘制波形时t0-t2保持0电平、t2-t5保持5电平、t5-t7保持3电平,完全还原方波形态,不会出现斜线过渡的三角波问题
内容的提问来源于stack exchange,提问作者HenningNT
相关产品推荐
相关产品推荐

