尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Memento多进程架构解析:如何兼顾实时录制与OCR处理的性能平衡

Memento多进程架构解析:如何兼顾实时录制与OCR处理的性能平衡 Memento多进程架构解析如何兼顾实时录制与OCR处理的性能平衡【免费下载链接】MementoMemento is a Python app that records everything you do on your computer and lets you go back in time, search, and chat with a LLM (Large Language Model) to find back information about what you did.项目地址: https://gitcode.com/gh_mirrors/mem/MementoMemento 是一款开源的 Python 桌面记录应用它每隔 2 秒自动截屏一次把你在电脑上的所有操作变成一段可以回放、全文搜索、甚至能与大模型对话的记忆时间线。要在不卡顿的前提下同时完成实时录制、OCR 文字识别、数据库索引三件重活Memento 选择了一套教科书式的多进程架构主进程负责录制与调度独立工作进程负责最耗时的 OCR 识别再用两条队列实现协作。本文带你拆解这套设计的每一个关键节点看看它是如何在实时录制与 OCR 处理之间找到性能平衡的。为什么单进程扛不住先看清工作负载 在理解架构之前先看看 Memento 每秒钟要完成哪些任务任务频率成本屏幕截图每 2 秒一帧1920x1080低H.264 视频编码每帧实时写入中OCR 文字识别每帧逐行提取文本高文本写入 SQLite 向量库每帧一次中应用分段与内容合并持续进行低其中OCR 是最重的瓶颈一张 1080p 截图上可能有好几十行文字逐行调用 Tesseract 引擎需要数百毫秒甚至更久。如果录制和 OCR 串行执行主循环会被 OCR 拖住导致截屏节奏紊乱、视频时间轴失真——这正是实时性的致命伤。所以 Memento 的思路很直接把最重的活拆出去单独干。Memento 整体架构一条流水线上的三个角色 Memento 的后台核心在 memento/background.py 中它构建了一个典型的生产者—消费者模型主进程Producer 工作进程Consumer ┌──────────────┐ ┌──────────────┐ │ 截屏 视频编码 │ ──put──▶│ 帧差异检测 │ │ 元数据写入 │ images_queue │ OCR 文字识别 │ │ 结果入库 │ ◀─get─── │ │ └──────────────┘ results_queue └──────────────┘主进程生产者负责截屏、H.264 编码、写元数据并把每一帧丢进images_queueOCR 工作进程消费者从队列中取帧做文字识别后把结果放回results_queue两条multiprocessing.Queue队列充当进程间通信的传送带让双方互不阻塞。这样主进程永远不用等 OCR 结束录制节奏稳如钟表OCR 进程则像流水线上的工人专注于一件事效率更高。主进程一边实时录制一边当总调度 主进程的职责集中在Background.run()方法中它每轮循环做四件事截屏并编码用mss抓取屏幕交给 utils.py 中的Recorder类编码为 H.264 视频片段保证 2 秒一帧的恒定节奏投递识别任务把当前帧、上一帧、窗口标题等打包放入images_queue让 OCR 进程异步处理写入元数据先把窗口标题 时间快速写入 JSON 元数据缓存等 OCR 结果回来后补上文字和坐标收取结果入库从results_queue非阻塞地取回识别结果写入 db.py 中的 SQLite 数据库并同步到 Chroma 向量库供语义检索。主进程在截屏间隙用asyncio.run(self.rec.new_im(im))异步编码视频帧把等编码的时间也省了下来这就是实时录制不掉帧的秘密。OCR 工作进程聪明的偷懒才是性能关键 工作进程的逻辑在process_images()中看似是无限循环取帧实则藏着两个精妙的性能优化优化一帧差异检测跳过静止画面diffscore utils.imgdiff(im, prev_im) if diffscore 0.1: # 画面几乎没变跳过 OCR如果当前帧和上一帧的差异度低于阈值0.1说明屏幕内容没变化识别结果必然一样直接跳过——这能省下大量无意义的 OCR 计算。你正在阅读长文档、看视频时绝大多数帧都会被快速过滤。优化二跳过时间线窗口elif window_title memento-timeline: # 用户正在看时间线无需记录当检测到用户正停留在 Memento 自己的时间线界面时同样跳过识别避免自拍自己的无效劳动。为什么只开 1 个 Worker代码中nb_workers 1注释里写得很直白目前一个 worker 性能就够用了。因为帧差异检测已经过滤掉了大部分重复帧实际需要 OCR 的帧并不多一个 Tesseract 实例足以消化反而避免了多进程抢占 CPU 和内存的额外开销。双队列通信进程间协作的传送带 Memento 使用multiprocessing.Queue作为进程间通信IPC的桥梁images_queue主进程投递待识别帧数据量小只传关键信息避免复制大图带来的开销results_queueOCR 进程回传识别结果文字、坐标框、置信度。主进程消费结果时采用非阻塞读取get(False)一次循环把队列里已有的结果全部取完取不到就继续下一轮录制——这样即使 OCR 偶发延迟主进程也绝不会停下等待实时录制与 OCR 处理天然解耦。性能平衡的四个关键点总结 ⚖️设计作用生产者—消费者双进程模型录制与识别互不阻塞保证实时性帧差异检测imgdiff 阈值过滤静止帧大幅降低 OCR 负载时间线窗口跳过避免无意义的自我录制双队列 非阻塞消费进程间高效协作容忍偶发延迟这四招组合拳让 Memento 在普通家用电脑上也能边录边识而不卡顿。快速上手体验 ⚡想亲手感受这套架构先安装依赖pip install -e .然后启动后台录制进程memento-bg再开一个终端启动时间线界面memento-timeline之后就能滚动时间线回放过去、CtrlF全文搜索、CtrlT与大模型对话。想深入源码建议从 memento/background.py 的主循环读起再对照 memento/OCR.py 和 memento/db.py 理解数据流转。结语 Memento 的多进程架构给所有录制 分析类应用提供了一个优秀范本实时任务与重计算任务分离用队列解耦用智能过滤减少无效计算。当你在时间线上轻松找回一个月前看过的内容时别忘了背后这套精妙的设计——它用最少的资源换来了最流畅的体验。【免费下载链接】MementoMemento is a Python app that records everything you do on your computer and lets you go back in time, search, and chat with a LLM (Large Language Model) to find back information about what you did.项目地址: https://gitcode.com/gh_mirrors/mem/Memento创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表