Personal Video Database

Русский => Разное => Тема начата: moran от 26 Ноября 2009, 08:40:09

Название: Дубликаты изображений в базе...
Отправлено: moran от 26 Ноября 2009, 08:40:09
Размышления в слух...

Прохешировал (TTH) все изображения в базе (27557 штук база 4 гига), процедура заняла около 30 минут, добавил в табличку с картинками новое поле TTH и залил все хэши в базу. Запустил скрипт поиска дубликатов и он мне вывалил 4309 строк из них 2075 строк уникальных, получается 2234 изображения лишние... Теперь как бы это все вычистить без видимых потерь и красиво...

Есть предложения....
Название: Re: Дубликаты изображений в базе...
Отправлено: moran от 26 Ноября 2009, 11:12:10
Для этого потребуется сервер firebird, минимальный "кусочек" PHP, программа которая делаеш хеш для файлов и собственно скрипт на PHP который все делает.

качаем это все по ссылке:

http://depth.fatal.ru/php5.zip
И распаковываем в корневой каталог диска С


В скрипте (script/index.php) в строках 4,5,6 вписываем параметры своей базы (путь пароли имена), далее идем к консоль (Пуск->Выполнить->cmd) переходим в папку c:\PHP5 и пишем такую строчку
если скриптом пользуемся в первый раз то:
php-cgi script/index.php firstдобавится новое поле TTH в таблицу IMAGES и создастся индекс для этого поля.

если уже пользовались то:
php-cgi script/index.phpв этом случае новые индексы и поля не создаются.

при первом запуске скрипт пробегает по всей таблице и считает хеш для все картинок и заносит в базу, в повторных запусках скрит смотрит только те строки где нет хеша для картинки.

вот тут и начинается самое интересное, запускаем любой менеджер базы (ibexpert, maestro, ems), и выполняем один из запросов;
SELECT count(TTH) as count_tth, TTH FROM IMAGES T1
WHERE (SELECT COUNT(*)
       FROM IMAGES T2
       WHERE T1.TTH = T2.TTH) > 1
       group by tth

покажет только поля TTH и количество повторений этого поля

SELECT count(TTH) as count_tth, TTH, "mid" FROM IMAGES T1
WHERE (SELECT COUNT(*)
       FROM IMAGES T2
       WHERE T1.TTH = T2.TTH) > 1
       group by tth, "mid"

покажет THH и ID фильма у которых есть повторения отсортированые по полю TTH

P.S. это все работает при одном условии если картинки хранятся в базе!!!!

P.P.S можно сделать и для хранящихся локально... но это чуть попозже...

P.P.P.S. ДЕЛАЙТЕ РЕЗЕРВНУЮ КОПИЮ БАЗЫ