You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用DistinctUntilChanged时保留变更前最后一项以维持日志波形形状

日志条目压缩实现方案

核心逻辑

你需要在日志写入/过滤环节维护两个状态变量,确保数值跳变的边界被完整保留:

  • last_saved_val:上一次已写入日志的数值
  • last_unsaved_entry:最新的未写入的重复数值条目(附带时间戳)

处理规则

每产生一条新日志条目时按以下流程处理:

  1. 首次写入时直接将当前条目写入日志,初始化两个状态变量
  2. 若当前数值和last_saved_val相等:仅更新last_unsaved_entry为当前条目,不写入磁盘
  3. 若当前数值和last_saved_val不相等:
    • 先将last_unsaved_entry写入日志(即数值变更前的最后一条)
    • 再将当前新数值的条目写入日志
    • 更新两个状态变量为当前数值和当前条目
  4. 程序退出/日志滚动结束前,额外将当前的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 02:36:02