Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2016.03.13;
Скачать: [xml.tar.bz2];

Вниз

Быстрый поиск комбинации строк в массиве   Найти похожие ветки 

 
Ega23 ©   (2015-05-26 16:07) [120]


> Быстрее, чем БД сделать это невозможно.


Это чрезвычайно смелое утверждение.


 
кгшзх ©   (2015-05-26 16:09) [121]

Да ну на. Это время будет на пару порядков (если не все три) меньше,

Нахрена хешировать-мушировать, если куда полезнее иметь границы индексов ппервичного массива?


 
Ega23 ©   (2015-05-26 16:09) [122]


>  куда полезнее иметь границы индексов ппервичного массива?


И что это даст?


 
MsGuns ©   (2015-05-26 16:11) [123]

>Но СУБД ради этого дополнительную разворачивать - это из пушки по воробьям

Если оракл, то да. Но я об нем по-моему и не заикался. А "развернуть" какой-нибудь постгресс или мускул ОДИН раз на сервере, ИМХО, гораздо проще, чем изобретать всякие хэши и лепить их на КАЖДЫЙ клиент, пусть даже методом простого копирования.


 
Sha ©   (2015-05-26 16:11) [124]

> sniknik ©   (26.05.15 15:50) [116]

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

1. Когда видит, что фамилий в диапазоне слишком много,
он разбивает диапазон фамилий на части до тех пор,
пока самая левая часть не станет скажем 100000 записей или меньше.

2. После этого данные левой части считываются и обрабатываются.

3. Повторяем процесс для несчитанной правой диапазона.

4. Границы разбиения можно сохранить в ini, чтобы не повторять разбиение каждый раз, а только проверять валидность количества.


 
кгшзх ©   (2015-05-26 16:12) [125]

перебор будет не всего массива а начиная с и по

Ищем например петрова василия михайловича.

смотрим в индексный массив по "пвм" и видим, что такие имена идут в исходном массиве с 10000 по 20000 строку.


 
Ega23 ©   (2015-05-26 16:18) [126]


> смотрим в индексный массив по "пвм" и видим, что такие имена
> идут в исходном массиве с 10000 по 20000 строку.


А, я понял.
Спорно. Надо тестировать. Возможно, что на сортированном списке хэшей будет быстрее. Возможно - нет. Возможно будет зависеть от того, что в этом десятитысячном наборе пришло.
Мы когда поисковую систему делали перебрали с десяток вариантов.


 
MsGuns ©   (2015-05-26 16:27) [127]

Изобретаем новый поисковик ?


 
кгшзх ©   (2015-05-26 16:28) [128]

всем можно мне нельзя?


 
D.N. Polezhaev ©   (2015-05-26 16:35) [129]


> Это чрезвычайно смелое утверждение.

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

И в таком аспекте можно обогнать БД на джойне, особенно если мощность клиента сравнима с сервером :)) Но выигрыш, если и будет - то не большой.

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

Поэтому принципиально обогнать БД - невозможно, потому что ты будешь делать тоже самое. Ну может быть сможешь немного лучше заточить алгоритм под специфику данных. Но и здесь тебя со временем будет ждать засада, поскольку по мере изменения данных БД будет оптимизировать план выполнения запроса, а твой код вряд ли будет автоматически подстраивающемся.

Поэтому это можно свести к вопросу о том, что БД вообще не нужна. Лучше написать свою под свои задачи, которая будет работать быстрее и оптимальнее. Теоретически - да, но в долгосрочной перспективе это будет сизифов труд и изобретение велосипеда.


 
sniknik ©   (2015-05-26 17:40) [130]

> Если не считать программиста идиотом, то можно предположить,
> что он будет действовать примерно следующим образом:
пусть он гений, у него НЕТ таких, и вообще многих возможностей. работа локально с массивом/таблицей/... ОЧЕНЬ отличается от ситуации когда те же данные лежат на sql ом сервере.

последний раз, больше не буду.
> 1. Когда видит, что фамилий в диапазоне слишком много,
> он разбивает диапазон фамилий на части до тех пор,
> пока самая левая часть не станет скажем 100000 записей или меньше.
КАК, он это сделает? массив не прямо тут, под рукой, он ТАМ. здесь нет количества, нет диапазона, есть запрос в котором ты должен задать условие... и задать его так чтобы получить нужное количество, диапазон, раз уж свели к нему. а следующим запросом следующий, не пересекающийся диапазон...
что НЕВОЗМОЖНО если нет определяющего значения для использования его в условии запроса.

> 3. Повторяем процесс для несчитанной правой диапазона.
как определить несчитанный диапазон?

у тебя логика "файл-серверная", а все субд уже на "клиент-сервер" перешли, давно.


 
Sha ©   (2015-05-26 17:52) [131]

> sniknik ©   (26.05.15 17:40) [130]
> у тебя логика "файл-серверная", а все субд уже на "клиент-сервер" перешли, давно.

Читаю диапазон из ini:
"".."Козлов"
150000

Смотрю 150000>100000

Спрашиваю, скока в интервале "".."Дятлов"

Получаю 80000

Сравниваю 80000<100000

Читаю из базы интервал "".."Дятлов"

Читаю из базы интервал "Дятлов".."Козлов"


 
Sha ©   (2015-05-26 17:55) [132]

Сорри, торопился, улетело в процессе редактирования, но суть должна быть понятно.

А если опять непонятно, то не моя логика тут виновата. Я так думаю )


 
sniknik ©   (2015-05-26 18:11) [133]

> Смотрю 150000>100000
раньше просил
> объясни "в запросах",
именно поэтому... нет, такого в sql, невозможно задать такое условие (с лимитами не рассматриваю, только усложнять, т.к. там оно не по порядку в базе выбирает).

> Спрашиваю, скока в интервале "".."Дятлов"
> Получаю 80000
частность, ты принял определителем диапазона сами данные, фамилию. это не гарантированно, так же как и порядок выборки

а допустим они там ВСЕ с фамилией "Дятлов", и тебе пришло количеств = 10 миллионов. а диапазон для переноса на клиент/обработку положили в 10-тыс.  

> А если опять непонятно, то не моя логика тут виновата. Я так думаю )
понятно. больше чем ты думаешь. понятно, что это кривая логика.


 
Сергей Суровцев ©   (2015-05-26 18:20) [134]

Решение MsGuns самое красивое, по сути это обход админа основной БД. На дубле можно уже и индексы строить и еще много чего. Только вряд ли прокатит. Именно по этой же причине. Начнут трещать про безопасность данных, неподконтрольность и т.д. А втихую дак делать себе дороже. Опять же сервак нужен неслабый, а это уже административное решение, а не программирование.

Но на клиента тащить всю таблицу тоже не вариант. Сейчас строк миллион. А завтра будет 2, 10, тогда как? Да и моща клиента с серваком несравнима. По сути, конечно, должна быть классика - основная выборка на БД.


 
Ega23 ©   (2015-05-26 18:29) [135]


> Решение MsGuns самое красивое, по сути это обход админа
> основной БД


Ага, вот только как быть с синхронизацией данных? Данные-то нужны актуальные.


 
Сергей Суровцев ©   (2015-05-26 18:39) [136]

>Ega23 ©   (26.05.15 18:29) [135]
>Ага, вот только как быть с синхронизацией данных? Данные-то нужны актуальные.

А то они на клиенте актуальнее будут? Там и каналы связи похилее, и железо несравнимо. И тянуть надо не один раз, а на КАЖДОГО клиента.


 
Сергей Суровцев ©   (2015-05-26 18:39) [137]

>Ega23 ©   (26.05.15 18:29) [135]
>Ага, вот только как быть с синхронизацией данных? Данные-то нужны актуальные.

А то они на клиенте актуальнее будут? Там и каналы связи похилее, и железо несравнимо. И тянуть надо не один раз, а на КАЖДОГО клиента.


 
Сергей Суровцев ©   (2015-05-26 19:03) [138]

>Sha ©   (26.05.15 17:52) [131]
>Читаю из базы интервал "Дятлов".."Козлов"

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


 
Sha ©   (2015-05-26 19:52) [139]

> sniknik ©   (26.05.15 18:11) [133]
> а допустим они там ВСЕ с фамилией "Дятлов",

А также с тем же именем и отчеством, и нет идентификаторов, и нет индексов ни по какому полю.
"вы вообще с базами работали?" )))

> понятно, что это кривая логика.
Если бы было понятно, то "нет, такого в sql" ты не писал бы.



> Сергей Суровцев ©   (26.05.15 19:03) [138]
> ..Алгоритм будет весьма сложный, причем нужно гарантировать, что никого не упустит.

Вот более простая модификация. Может, чуть более медленная.

Сортируем искомые 10К записей. Это начальный диапазон.
Узнаем сколько в базе от первой записи до последней.
Если больше их там 100К, уменьшаем диапазон вдвое (до 5К).
Повторяем пока получим, в границах диапазона в базе лежит меньше 100К
или границы диапазона сойдутся так, что между ними нет искомых записей.
В первом случае запрашиваем все записи диапазона,
во втором - каждую из границ отдельно.
Как-то одним из ранее описанных способов обрабатываем полученные данные.
Откусываем обработанный диапазон от начального диапазона.
Повторяем для оставшегося огрызка.


 
sniknik ©   (2015-05-26 22:58) [140]

> А также с тем же именем и отчеством, и нет идентификаторов, и нет индексов ни по какому полю.
выборка данных по данным, причём по самим же выбираемым... гиблое дело. подумай, если ориентироваться на значения которые передаются с клиента то нафига сервер? ведь получается, что они на клиенте уже есть, раз их в условие выборки прописывают.

про нет идентификаторов, условие задачи такое было, ну вот нету идентификаторов. если "переусловить" то это "игра в поддавки", давай уж сразу - "есть id - автоинкремент, без дырок, суть порядковый номер записи"... и все ПРОБЛЕМ НЕТ. но тока в реальности такого не бывает. а в идеальном мире Юрий бы уже все решил, как было сказано, изменением структуры таблицы "костылизируя" текущие недостатки архитектуры.

> Если бы было понятно, то "нет, такого в sql" ты не писал бы.
ну да, счаз проникнусь, раскаюсь, пойму... и блин все одно нет такого в sql.

> Вот более простая модификация. Может, чуть более медленная.
> Сортируем искомые 10К записей. Это начальный диапазон.
> ...
чтобы отсортировать нужно их получить на клиента, все. так и не доходит? ты опять оперируешь файл-серверной логикой.
И границы ты не определишь, т.к. выборка будет вся, по условию. т.е. на запрос "дайте ивановых" ты их всех и получишь, будь их все 10к или он всего один. и в том и другом случае проблема, усложнение, и никакого диапазона.
ну, для полноты можно команды типа "лимит" обговорить, они делают вид что дают диапазон, но дают его по готовому отсортированному результату. без "order by" даже не начнет, а с ним, при множестве повторений значений в поле будет та же неопределенность в порядке записей (по сортируемому полю значения одинаковы и серверу пофигу будет что там "страницы" поменялись и записи не в том порядке, что были... по сортируемому порядок есть? есть! будьте довольны...)


 
Kerk ©   (2015-05-26 23:05) [141]

Есть БД, которую нельзя менять. Есть кривой сервер приложений, который неизвестно почему падает. И очень хочется найти идеальное решение для клиентского приложения. Да не будет идеального решения, будет танго на костылях :)

http://ic.pics.livejournal.com/zeit_raffer/72797520/5107/5107_original.jpg


 
Sha ©   (2015-05-26 23:38) [142]

> sniknik ©   (26.05.15 22:58) [140]
> чтобы отсортировать нужно их получить на клиента, все.
> так и не доходит?

До кого-то точно не доходит.
Получаю диапазон FIO, по нему индекс есть по условию.
Сортирую полученную часть.

> ты опять оперируешь файл-серверной логикой.

ну да, ведь select же

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

запрос дайте "Ивановых Иванов Иванычей". Ну не может их быть 10^5 штук. И потом, насколько я понимаю, в данном случае нет смысла хранить в базе 10^5 АБСОЛЮТНО одинаковых записей. Хоть какое-то различие должно быть. Значение этого различающегося поля можно использовать в качестве доп условия. Но, разумеется, скорее всего это не потребуется.

PS завтра пример напишу, если время будет


 
Sha ©   (2015-05-27 09:21) [143]

> Сергей Суровцев ©   (26.05.15 18:20) [134]
> Решение MsGuns самое красивое, по сути это обход админа основной БД.
> На дубле можно уже и индексы строить и еще много чего.

Если требуется решить только одну указанную задачу,
то проще дублировать не сервер, а клиента,
и на этом "промежуточном" клиенте решать ее одну.


 
TohaNik ©   (2015-05-27 12:45) [144]


> Sha ©   (27.05.15 09:21) [143]

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


 
Romkin ©   (2015-05-27 13:04) [145]

Добавлю и свои пять копеек: поставить memcached, кусками закачать данные - и найти.


 
Сергей Суровцев ©   (2015-05-27 14:39) [146]

>Sha ©   (26.05.15 23:38) [142]
>запрос дайте "Ивановых Иванов Иванычей". Ну не может их быть 10^5 штук.

Теоретически может. Это раз. Конец диапазона может попасть в середину полных однофамильцев и тогда следующим шагом пойдут дубли. Это два. Наличие доп. поля ничего не даст, поскольку не участвует в теоретическом определении порядка, как ФИО. Да, некоторые записи отличаются этим полем, а некоторые нет. Можем точно сказать что с таким значением уже взяли, а с таким еще надо? Нет. Единственный случай, когда можно брать таким методом это сквозные ID, не важно с пропуском или без. Там можно подобрать границы, иначе гарантировать ничего нельзя, а это неприемлемо.


 
Ega23 ©   (2015-05-27 14:56) [147]

Надо сортировать по ID т его в выборку включать. Тогда, может быть, удастся всё это дело частями затянуть (если перед затягиванием snapshot-транзакцию открыть и в её рамках всё это дело тащить).


 
sniknik ©   (2015-05-27 14:58) [148]

> Единственный случай, когда можно брать таким методом это сквозные ID, не важно с пропуском или без.
дополнение
пропуски важны, вернее их отсутствие, приводились мной для "логики"(под впечатлением) - "берем общее количество, делим пополам, и т.д. до оставшегося огрызка". так то, при изменении алгоритма это само собой не важно.


 
Sha ©   (2015-05-27 15:40) [149]

>Сергей Суровцев ©   (27.05.15 14:39) [146]
>> запрос дайте "Ивановых Иванов Иванычей". Ну не может их быть 10^5 штук.
>Теоретически может. Это раз.

Тогда пусть падает. Это два )

> Конец диапазона может попасть в середину полных однофамильцев
> и тогда следующим шагом пойдут дубли.

Ситуация большого количества полностью идентичных фио обрабатывается, все попадут в один диапазон. Уже дописываю.

> Единственный случай, когда можно брать таким методом это сквозные ID,
> не важно с пропуском или без. Там можно подобрать границы

Дык мне давно уже тут запретили юзать ID )


 
Kerk ©   (2015-05-27 15:41) [150]

Раз пошла такая пьянка. А читать напрямую из БД в обход глючного сервера приложений уже кто-нибудь предлагал?


 
Сергей Суровцев ©   (2015-05-27 15:48) [151]

>Sha ©   (27.05.15 15:40) [149]
>Дык мне давно уже тут запретили юзать ID )

А зря. ))
Какой-то идентификатор в этой базе должен быть. Пусть не ID сурагатный, а какой-нибудь ИНН, номер карты, еще что... Как-то же эту базу используют? Четко человека выделяют? Иначе она годится только для подбора статистики по однофамильцам. ))


 
Jeer ©   (2015-05-27 15:49) [152]

В довесок:
А настроить сервер приложений никто не пробовал?


 
кгшзх ©   (2015-05-27 15:59) [153]

прямой поиск это конечно самое прямое.
но.

там же на апп-сервере скорее всего все по взрослому, ява, хибернейт и все дела.

то есть если апп-сервер стартовал в понедельник, и в базу ФИО насовали тыщщу новых персоналий,
то в самом sql сервере сегодня их может еще не быть.


 
sniknik ©   (2015-05-27 16:06) [154]

> Дык мне давно уже тут запретили юзать ID )
его нет в исходных задачи. + с ним какое никакое костыльное(тормозное) решение с "кусочной технологией" возможно. и ты бы легко "отмазался" от необходимости понять проблему ТС.

> Как-то же эту базу используют?
а может не используют, не базу конечно а таблицу, только хотят? может это таблица логов с действиями по именам, куда только добавляли, и тут "внезапно" - а нафига нам такие логи если их не читать? ставят задачу по обработке/предоставлению статистики.
не сталкивались = не бывает?


 
Сергей Суровцев ©   (2015-05-27 16:07) [155]

Я вообще не понимаю и представить пока не могу сам смысл первоначальной задачи. Из миллиона нужно выбрать по произвольным фамилиям 10тыс. При этом в итоговую выборку попадут, естественно и все полные однофамильцы. И кому это поможет? То есть в итоговом будет точно больше 10тыс. и потом в них опять копаться еще что-то выгрызать?
Хорошо бы иметь изначальное понимание того что есть и того что надо. А то решаем узкую промежуточную задачу без понимания нужного результата, так еще и спорим, как лучше. )))


 
Сергей Суровцев ©   (2015-05-27 16:21) [156]

>sniknik ©   (27.05.15 16:06) [154]
>не сталкивались = не бывает?

Я чаще сталкивался с тем, что заказчик не совсем представляет что и как ему нужно. Например описывает проблему ориентируясь только на то, что он сам предполагает ее решение. А то что решение может быть альтернативным, причем с тем же или лучшим даже не задумывается. Так к примеру бывает со всякими группировочными таблицами, которые были "всегда", но понять что они нужны только как промежуточный вариант когда у тебя исходные данные на бумаге, а если в базе, то любой результат можно получить минуя их, это понять бывает непросто.


 
Jeer ©   (2015-05-27 16:23) [157]

Да так сечас Ю.З. и рассказал :)
С большой вероятностью ему вооще никто и ничего не запрещает, иначе он там не работал бы,  я - тоже.


 
Юрий Зотов ©   (2015-05-27 16:40) [158]

В таблице, где миллион записей, ID есть (причем почему-то строковый).

Во входных данных (где 10 тыс. ФИО) никакой уникальности нет.


 
Сергей Суровцев ©   (2015-05-27 16:52) [159]

То что в результирующую таблицу попадет первый попавшийся полный однофамилец из исходного миллиона устраивает? Других критериев отбора кроме ФИО нет? Или в результирующую надо собрать и всех однофамильцев тоже?


 
sniknik ©   (2015-05-27 17:03) [160]

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

> никакой уникальности нет.
даже в ID? (строковый намекает...). если да, то считай его нет.



Страницы: 1 2 3 4 5 6 7 вся ветка

Форум: "Прочее";
Текущий архив: 2016.03.13;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.84 MB
Время: 0.024 c
15-1435095040
Юрий
2015-06-24 00:30
2016.03.13
С днем рождения ! 24 июня 2015 среда


15-1435951465
Денис Комаров
2015-07-03 22:24
2016.03.13
Возможности MS Access


1-1335169455
lilyalm
2012-04-23 12:24
2016.03.13
Динамическое создание формы


15-1435534940
Дмитрий С
2015-06-29 02:42
2016.03.13
Выпадающий календарь. Вопрос по дизайну.


15-1435667122
Дмитрий С
2015-06-30 15:25
2016.03.13
hex 2 bin





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский