Выборка из mysql и сравнение значений PHP

Ilekor
На сайте с 22.04.2009
Offline
138
3107

Приветствую, друзья! С прошедшими и наступающими праздниками.

Требуется Ваша помощь.

есть к примеру таблица news с столбцами


id, n_id, sig

требуется сравнить значение столбца sig со всеми остальными значениями sig

Например получили значения sig1 и сравниваем с sig1-sig2-sig3-sig4 и т.д.

после сравнения продолжаем sig2 и сравниваем с sig1-sig2-sig3-sig4 и т.д.

и так до конца всех значений

Я все это собирал в массив копировал в другой массив и сравнивал их.

Но все это работало пока строк было немного.

Сейчас строк больше 100 000 и сервер с моим решением отказался выполнять все это дело. Загружая проц на 90%

Может Вы подскажите какое решение с моей проблемой?

:mad: Я пытался сделать это через AJAX, но мои познаний в JS очень минимальные и поэтому не смог представить как это реализовать.

Лучший дорген 21 века AgDor(http://agdor.info)
totamon
На сайте с 12.05.2007
Offline
437
#1

в чем смысл этого сравнивания, что в итоге это должно давать?

Домены и хостинг https://8fn.ru/regru | Дедик от 3000р https://8fn.ru/73 | VPS в Москве https://8fn.ru/72 | Лучшие ВПС, ТП огонь, все страны! https://8fn.ru/inferno | ХОСТИНГ №1 РОССИИ https://8fn.ru/beget
Ilekor
На сайте с 22.04.2009
Offline
138
#2
totamon:
в чем смысл этого сравнивания, что в итоге это должно давать?

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

vandamme
На сайте с 30.11.2008
Offline
672
#3

Ilekor, и как часто надо это выполнять?

Ilekor
На сайте с 22.04.2009
Offline
138
#4
vandamme:
Ilekor, и как часто надо это выполнять?

подобный механизм выполняется 1-2 раза в месяц

vandamme
На сайте с 30.11.2008
Offline
672
#5

Ilekor, ну так разбить задачу.

ДП
На сайте с 23.11.2009
Offline
203
#6

Вообще вам бы в крон (планировщик) засунуть эту задачу и в скрипте генерировать отчет, который смотреть через вебморду. Ну и разбивать над блоки, а не сразу все из БД загружать.

По поводу алгоритма сравнения - ваша запись

Например получили значения sig1 и сравниваем с sig1-sig2-sig3-sig4 и т.д.

означает, что вы по-очереди сравниваете значения или первое значение со значением, полученным из объединения остальных?

iqmaker
На сайте с 17.04.2012
Offline
309
#7

А какой тип у колонки sig и как выглядит сравнение двух значений между собой?

siv1987
На сайте с 02.04.2009
Offline
427
#8

Вам нужно проверить уникальность строк? Group by не подходит?

iqmaker
На сайте с 17.04.2012
Offline
309
#9

В общем не дожидаясь ответа по вангую. Если я верно понимаю задачу, то сравнивать все значения со всеми не обязательно, т.к. если упорядочить данные по некоторой сравниваемой величине, то сравнивать нужно только соседние элементы, допустим имеем упорядоченный список:


[1,2,3,4,20,24,28,40,41,50,90,100,101]

задача найти группы разность между элементами которых не более 10., тогда достаточно взять элемент и сравнивать его со следующим, пока условие не перестанет выполняться, т.е

abs(1 - 2) < 10 # да, добавляем элементы в общее множество

abs(2 - 3) < 10 # аналогично

......

abs(4-20) < 10 # нет, предыдущее множество сформировано, начинаем формировать новое

abs(20 - 28) < 10 и т.д.

таким образом задача решается в один проход, даже для кол-ва элементов более млн. все будет быстро

на python, код будет таким:


import random

# создаем тестовый список
items = [1,2,3,4,20,24,28,40,41,50,90,100,101] # тестовые данные

#items = [1e10 * random.random() for x in xrange(int(1e6))] # на большом количестве данных если нужно
# сортируем по возрастанию своей функцией
items = sorted( items, key=lambda x: x )

similar = []
# обходим сравнивая текущий элемент со следующим
for i, e in enumerate(items[:-1]):
if abs(e-items) <= 10.0:
if not similar:
similar.append(e)
similar.append( items )
else:
if similar:
print similar
similar = []

if similar:
print similar

вывод по данным:


[1, 2, 3, 4]
[20, 24, 28]
[40, 41, 50]
[90, 100, 101]

но затык может быть в том, что множество ваше не сортируемое и условно "расстояние" элемента 1 до 10 может равняться "расстоянию" от 5 до 6, но об этом вы ничего не сказали

Ilekor
На сайте с 22.04.2009
Offline
138
#10

Друзья, в значении хранится текстовый код изображения, вот эти коды и сравниваются на похожесть кодов, вот так

сначала получаем и сравниваем sig1 и sig2, mysql такого сравнения не сделает, это функция библиотеки php


$r_sig = puzzle_vector_normalized_distance($value1['sig'], $value2['sig']);
echo $r_sig

и так до тех пор пока sig1 не пройдет все значения

после чего sig2 начинает также проходить по все проверкам и так пока не закончится

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий