Автор Тема: Дубликаты изображений в базе...  (Прочитано 11141 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн moran

  • Модератор
  • *****
  • Сообщений: 403
  • Пиво - тоже компонента...
Дубликаты изображений в базе...
« : 26 Ноября 2009, 08:40:09 »
Размышления в слух...

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

Есть предложения....
Русские кинопремьеры 2001-2010 (www.kinopoisk.ru)
80.64.88.51:ГОД_ПРЕМЬЕР
login: ГОД_ПРЕМЬЕР
password: ГОД_ПРЕМЬЕР
2006-2008 в процессе, 2001-2005,2009-2010 доступны...

Оффлайн moran

  • Модератор
  • *****
  • Сообщений: 403
  • Пиво - тоже компонента...
Re: Дубликаты изображений в базе...
« Ответ #1 : 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. ДЕЛАЙТЕ РЕЗЕРВНУЮ КОПИЮ БАЗЫ
« Последнее редактирование: 26 Ноября 2009, 11:26:55 от moran »
Русские кинопремьеры 2001-2010 (www.kinopoisk.ru)
80.64.88.51:ГОД_ПРЕМЬЕР
login: ГОД_ПРЕМЬЕР
password: ГОД_ПРЕМЬЕР
2006-2008 в процессе, 2001-2005,2009-2010 доступны...