feat: 分片指纹存储改造 + 存量指纹重建脚本 #1657 #1669
Reference in New Issue
Block a user
Delete Branch "feat/fingerprint-chunks-1657"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
改动
1. 新建 video_fingerprint_chunks 表(Migration 063)
2. 新增 VideoFingerprintChunkModel
packages/adapters/sqlalchemy_impl/models.py3. 改造 dedup.py 指纹计算
compute_fingerprint()改为按时间分片抽帧VideoFingerprint新增chunks字段(list[FingerprintChunk])keyframe_phashes/color_histograms保留to_chunk_models()方法转换为 SQLAlchemy Modelcheck_duplicate()优先从分片表读取,回退到 JSON 字段(存量兼容)check_duplicate_task()写入分片表4. 改造 dedup_helpers.py
create_video_record_and_dedup()同步写入分片表5. 存量指纹重建脚本
apps/api/scripts/rebuild_fingerprint_chunks.py--dry-run和--batch-size6. 单元测试(11 个)
to_chunk_models()输出正确_save_fingerprint_chunks幂等性to_dict()向后兼容技术债务约束
Closes #1657
🚀 预览环境已部署
【阻塞级判定】
📊 审查概览
🔴 阻塞级问题(必须修复)
[apps/worker/video_processing/dedup.py: 286-293] N+1 查询问题导致严重性能隐患
check_duplicate方法中,循环遍历项目内所有视频(for existing in videos_in_project),并在循环内部调用self._get_existing_chunks(existing.id, session)查询数据库。如果一个项目中有 N 个视频,这将产生 1 + N 次数据库查询。对于视频较多的项目,会导致查重任务响应极慢甚至数据库连接耗尽。video_id IN (...)),然后在内存中构建字典进行匹配,避免在循环中进行数据库查询。[apps/api/scripts/rebuild_fingerprint_chunks.py: 106-122] 数据一致性缺失
video_fingerprint_chunks表,但未更新generated_videos表中的video_fingerprintJSON 字段。chunks表中是新算法的数据。当系统进行 MD5 精确匹配时,会使用旧 MD5,导致无法匹配到新算法处理的相同视频,查重功能失效。rebuild_one函数中,除了保存 chunks,还应更新GeneratedVideoModel.video_fingerprint字段为fingerprint.to_dict(),并提交事务。[apps/worker/video_processing/dedup_helpers.py: 103-107] 关键异常被静默吞噬
_save_fingerprint_chunks时使用了try...except Exception并仅记录 warning,未向上抛出异常。💡 改进建议(不阻塞合并)
check_duplicate中,新视频(可能有30个分片)与旧视频(10个分片)进行比对时,计算avg(min(hd))的逻辑会产生不对称的相似度分数。建议评估是否需要归一化处理,或者确认这种不对称在业务上是否可接受。✅ 良好实践
bulk_save_objects进行批量写入,效率较高。existing_count),支持重跑。🤖 由 AI 代码审查机器人自动生成 | 2026-09-03 12:52:38 | 模型:
🗑️ 预览环境已清理
PR #1669 已关闭或合并,对应的预览环境已被清理。