web worker 处理海量 html 去重与合并需遵循分片、隔离、低通信、可聚合四原则:分批指纹预筛、worker 内轻量语义归一化、主线程按指纹聚合、内存与异常兜底。

用 Web Worker 处理海量 HTML 或结构化数据的去重与合并,核心不是“把数组丢进线程跑一遍”,而是围绕分片、隔离、低通信、可聚合四个原则设计流程。真正卡顿的从来不是算法本身,而是主线程被阻塞、内存暴涨、或频繁克隆大对象。
分片加载 + 指纹预筛,避免一次性解析全量 HTML
面对成千上万条 HTML 片段(如爬虫结果、日志快照),别在主线程用 DOMParser 全部解析。应先做轻量级指纹提取:
- 每个 Worker 只接收一批 URL 或 HTML 字符串(建议 ≤500 条/批),不传原始 DOM 树
- Worker 内用正则或简易解析提取关键特征:标题文本长度、
<h1></h1>内容哈希、正文前 200 字的 SHA-256、关键 class/id 组合字符串 - 生成标准化指纹,例如:
title_len:28|body_hash:abc123|classes:article,post - 用 Set 或 Map 在 Worker 内本地判重,只保留首条;重复项标记为
duplicate: true后返回元信息,不传完整 HTML
结构+内容双层去重,Worker 内完成语义归一化
纯字符串或哈希易误判(如广告位变动、时间戳不同)。需在 Worker 中做轻量语义处理:
- 对每条 HTML,用
new DOMParser().parseFromString()构建微型 DOM(仅限当前批次,不挂载) - 移除动态干扰元素:
script、style、noscript、含timestamp/uuid的属性值 - 提取主干文本:取
<article></article>或.content内纯文本,转小写、去多余空格、截取前 500 字 - 计算该文本的 SimHash 或 MinHash(可用轻量 JS 库如
js-simhash),与已有指纹比对相似度 ≥0.95 即视为重复
主线程聚合合并,用最小堆或 Map 实现高效归并
Worker 只负责“识别是否重复”和“生成归一化主干”,合并逻辑由主线程统一调度:
- 每个 Worker 返回格式统一:
{ id: batchId, items: [{ originalId, fingerprint, normalizedText, isDuplicate }] } - 主线程用
Map按 fingerprint 分组,每组内保留originalId最小的为主记录,其余标记为“归属此主项” - 若需合并字段(如多个电话、地址列表),在分组后对同 fingerprint 的所有原始数据做字段级聚合:姓名去重拼接、手机号去重转数组、地址取出现频次最高者
- 最终输出是结构化数组,非 HTML 字符串,便于后续渲染或导出
内存与稳定性兜底,防低端设备崩溃
Worker 不报内存溢出,但会静默终止。必须主动管控:
- 单个 Worker 处理上限设为 ≤1000 条 HTML 或 ≤5MB 原始文本,超限自动切片再派发
- 每次 DOM 解析后立即调用
parser = null,dom = null,避免引用滞留 - 用
performance.memory(若支持)或定时self.postMessage({ type: 'ping' })检测 Worker 存活,超时未响应则重启 - 主线程监听
worker.onerror,捕获语法或解析异常,降级为单条顺序处理,不中断流程
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











