- Выбрать **устойчивый к изменениям "отпечаток"** (например, перцептивный хеш — pHash).
- Этот отпечаток должен вычисляться **одинаково** для любого изображения, независимо от того, старое оно или новое.
- Отпечаток — это **ключ для проверки дублей**.
Важно: все дальнейшие действия строятся вокруг этого отпечатка.
- Завести единый индекс (БД или специализированное хранилище), где:
- Ключ = отпечаток (pHash)
- Значение = факт существования (и, возможно, ID изображения)
- Это хранилище будет использоваться и для старых, и для новых изображений.
Цель: одна точка истины по дублям.
- Любое новое изображение:
1. Вычисляет свой отпечаток.
2. Проверяется сразу в едином индексе.
3. Если отпечаток уже есть → отклоняется как дубль.
4. Если нет → добавляется в индекс + сохраняется как новое.
- Эта логика всегда активна и имеет высший приоритет.
Новые изображения никогда не ждут окончания обработки старых.
- Старые изображения обрабатываются пачками (например, по 1000 файлов).
- Для каждой пачки:
1. Вычисляется отпечаток для каждого изображения.
2. **Проверяется в том же едином индексе (как и новые!).
3. Если отпечаток уже есть- пропускается (значит, уже есть в системе — возможно, как новое изображение!).
4. Если нет -добавляется в индекс + помечается как "обработанное из архива".
Таким образом, старые не перезаписывают новые, и наоборот.
- Поскольку новые изображения могут прийти во время обработки старых, важно:
- Не удалять и не пересоздавать индекс.
- Использовать атомарные операции: "проверить + добавить, если нет".
- Это исключает гонку: даже если старое и новое изображение одинаковы и поступают одновременно, в индекс попадёт только одно.
- Вести список уже обработанных файлов из архива (например, по пути или хешу имени)(у меня был статус изображения).
- При рестарте — продолжать с последней точки.
- Не трогать файлы, которые уже прошли через систему.
- Обработка архива — фоновая, низкоприоритетная задача.
- Она может занять часы или дни — это нормально.
- Главное: **новые изображения всегда обрабатываются мгновенно и корректно**.
- После завершения — весь архив либо в индексе, либо пропущен как дубль.
1. Единый индекс отпечатков — общая память системы, куда смотрят и старые, и новые изображения.
2. Новые изображения имеют приоритет и работают синхронно,
старые — обрабатываются асинхронно, но через тот же индекс,
поэтому дубли между эпохами невозможны.
Такой подход масштабируем, отказоустойчив и логически целостен.
Работал над подобной задачей: на ~1.5 млн объявлений в одной категории и ~50млн записей в другой, каждое объявление 1-40 изоображений(10+в среднем). Делал перехеширование на новую структуру(perceptual_hash hamming_distance) и удаление неактуальных, так как файлы остались а записи в БД уже нет.