|
Как отсортировать 1 миллиард записей?
|
|||
---|---|---|---|
#18+
ptr128 miltorg, а если в лоб падает? Код: sql 1. 2. 3. 4.
Спасибо. Вроде пока совсем быстро: Код: plsql 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2021, 23:33 |
|
Как отсортировать 1 миллиард записей?
|
|||
---|---|---|---|
#18+
Слушайте. А ведь вроде не имеет никакого смысла сортировать исходную строку если в ней не совпадают как минимум 10 цифр Почему я раньше до этого не додумался? Или нет? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2021, 00:39 |
|
Как отсортировать 1 миллиард записей?
|
|||
---|---|---|---|
#18+
Мне кажется что если выкинуть эти глупые циклы и заменить их на нормальный поиск в глубину - то можно просто учесть лексикографический порядок сортировки и получать на выходе сразу сортированный набор. Не? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2021, 00:48 |
|
Как отсортировать 1 миллиард записей?
|
|||
---|---|---|---|
#18+
miltorg, Все решается с помощью мат анализа (я такое еще в школе на высшей математике лузал как семечки). Погуглите по слову комбинаторика (там много подобных задач с формулами для решения - выбирайте что вам ближе по задаче, я все посты в теме не читал). Единственное привести строки к одному виду (в вашем случае начинаться и заканчиваться строка должна подчеркиванием, либо другим разделителем). Но вам конечно виднее. ))) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2021, 00:48 |
|
Как отсортировать 1 миллиард записей?
|
|||
---|---|---|---|
#18+
Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
нужно найти строки имеющие 10 совпадений цифр ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2021, 01:32 |
|
Как отсортировать 1 миллиард записей?
|
|||
---|---|---|---|
#18+
miltorg, for $e (@a, @b) {$inion{$e}++ && $isect{$e}++;} ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2021, 02:57 |
|
Как отсортировать 1 миллиард записей?
|
|||
---|---|---|---|
#18+
miltorg нужно найти строки имеющие 10 совпадений цифр ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2021, 06:50 |
|
Как отсортировать 1 миллиард записей?
|
|||
---|---|---|---|
#18+
По смыслу это что-то похожее на https://en.wikipedia.org/wiki/Cosine_similarity , которая часто используется в машинном обучении. У каждой записи есть вектор из 100 признаков. Можно эти данные представить как у ТС: если N-ый признак есть, то в строке присутствует число N. Другой способ представить эти данные - это сделать 100 столбцов, в каждом из которых ставить либо 0 (если признака нет), либо 1 (если признак есть). В итоге у нас получается разреженная матрица размером 1'000'000'000 х 100. Умножаем её саму на себя, получаем разреженную матрицу 1'000'000'000 х 1'000'000'000. Затем, если видим, что для пары "строка-столбец" значение ячейки больше некоторого значения (либо 10 в случае простого перемножения матриц, либо 0.5 если вычисляли cosine similarity), значит эти записи достаточно похожи друг на друга. Но здесь не понятен один момент. Если мы сравниваем этот миллиард записей между собой, то это задача кластеризации. Одни похожие записи попадут в один кластер, другие - в другой, и т.д. Задача найти скажем первые 10 наиболее похожих записей просто бессмысленная. Можно объединить такие записи в один кластер: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
Другие похожие записи попадут в другой кластер. А если у нас на входе допустим одна запись и нужно сравнить её с этим миллиардом записей и найти N наиболее похожих, то это совершенно другая задача. Я бы сначала разобрался в чем смысл исходной задачи. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2021, 07:19 |
|
Как отсортировать 1 миллиард записей?
|
|||
---|---|---|---|
#18+
Перечитал тему, и как-то не понял, мне одному кажется что решение задачи в иной плоскости? Дано: дата и 20 цифр. Почему их не загнать в таблицу "повдоль" в три колонки: номер записи, дата, число (одно!). В этом разе станет достаточно сопоставить количество совпадающих строк (чисел) у номеров записей в возрастающем порядке и только. Типа так: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57.
Получаем временную табличку, в которой заведомо меньше 100 записей (числа не более чем двузначные) и далее строим запрос по поиску требуемых совпадений, поиском вхождения в подстроку .. или можно точно также разложить повдоль и повторить сборку по 10 совпавших номеров.. Не? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2021, 09:09 |
|
Как отсортировать 1 миллиард записей?
|
|||
---|---|---|---|
#18+
Тут получим: numbercnt1rows52"1+2"72"1+2"13"1+2+4"33"1+2+4"62"1+3"82"1+3"23"1+3+4"43"1+3+4" Остается только выбрать такие строки, которые присутствуют в 4-х числах (задачу уменьшил, всего 8, найти совпадение по 4-м), тут это: 1+2, числа: 5,7,1,3 1+3, числа: 6,8,2,4 1+4, числа: 1,3,2,4 Справитесь? :) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2021, 09:23 |
|
Как отсортировать 1 миллиард записей?
|
|||
---|---|---|---|
#18+
Arhat109, только подвох в том, что у вас на выходе каждая из строк длиной до миллиарда номеров :) И как эти гигантские строки сравнивать между собой хз, или я чего-то не понял. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2021, 10:13 |
|
Как отсортировать 1 миллиард записей?
|
|||
---|---|---|---|
#18+
Arhat109, не понял я ничего. Вот, например, есть таблица: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
Добавьте в строку любую дату или вообще просто пронумеруйте. И найдите максимальное количество совпадений 10 цифр. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2021, 12:28 |
|
Как отсортировать 1 миллиард записей?
|
|||
---|---|---|---|
#18+
miltorg, любых 10 чисел или только первых? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2021, 12:36 |
|
Как отсортировать 1 миллиард записей?
|
|||
---|---|---|---|
#18+
miltorg, Вот например я вчера добавил 5 или чуть больше первых строк и получил mysql> WITH MyScope AS ( -> SELECT Id, Dannye, COUNT(1) OVER (PARTITION BY Dannye) AS Cnt -> FROM tabiz2010 ) -> SELECT * FROM MyScope WHERE Cnt>1; Код: sql 1. 2. 3. 4. 5. 6. 7. 8.
4 rows in set (18.27 sec) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2021, 12:37 |
|
Как отсортировать 1 миллиард записей?
|
|||
---|---|---|---|
#18+
miltorg, Забыл. Какую то цифру добавил искусственно. Сейчас ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2021, 12:39 |
|
Как отсортировать 1 миллиард записей?
|
|||
---|---|---|---|
#18+
Код: sql 1. 2. 3. 4. 5. 6.
Так должно быть. Вероятно что это 3 и 5-я строка исходного. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2021, 12:44 |
|
Как отсортировать 1 миллиард записей?
|
|||
---|---|---|---|
#18+
miltorg miltorg, Вот например я вчера добавил 5 или чуть больше первых строк и получил mysql> WITH MyScope AS ( -> SELECT Id, Dannye, COUNT(1) OVER (PARTITION BY Dannye) AS Cnt -> FROM tabiz2010 ) -> SELECT * FROM MyScope WHERE Cnt>1; Код: sql 1. 2. 3. 4. 5. 6. 7. 8.
4 rows in set (18.27 sec) Миллион строк за 20 сек. А дальше будет хуже или линейно будет рости? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2021, 12:49 |
|
Как отсортировать 1 миллиард записей?
|
|||
---|---|---|---|
#18+
miltorg, вот почему не можно сформулировать правильно конечную задачу? и отвечать на вопросы ptr128 любых 10 чисел или только первых? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2021, 12:57 |
|
Как отсортировать 1 миллиард записей?
|
|||
---|---|---|---|
#18+
Ares_ekb Arhat109, только подвох в том, что у вас на выходе каждая из строк длиной до миллиарда номеров :) И как эти гигантские строки сравнивать между собой хз, или я чего-то не понял. Откуда взяли миллиард номеров, если их в исходном сообщении указано 5000 "всего" и прирост по одному в день? Скуль стока не проживет .. кмк. ;) Как понимаю: 1. в числах строки нет повторов, отсюда их можно упорядочить по возрастанию 2. числа в строке максимум двухзначные, стало быть крайнее число: 99 3. Сама табличка не велика, но простой перебор комбинаций - огромен. Отсюда: Даже если одно и тоже число присутствует в каждой строке - в сборке длина строки не может превысить количество номеров строк. Откуда "миллиарды"? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2021, 12:58 |
|
Как отсортировать 1 миллиард записей?
|
|||
---|---|---|---|
#18+
вадя, Потому что мне не понятен вопрос. Какие первые цифры? Откуда это взялось? Откуда? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2021, 13:06 |
|
Как отсортировать 1 миллиард записей?
|
|||
---|---|---|---|
#18+
Arhat109, Потому что брать нужно 10 цифр из строки. 10. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2021, 13:07 |
|
Как отсортировать 1 миллиард записей?
|
|||
---|---|---|---|
#18+
miltorg Arhat109, не понял я ничего. Вот, например, есть таблица: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
Добавьте в строку любую дату или вообще просто пронумеруйте. И найдите максимальное количество совпадений 10 цифр. Добавил и даже пронумеровал. Посмотрите пример, он упрощен, там всего по 8 цифирек на строку. Можно скопировать и проверить.. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2021, 13:08 |
|
Как отсортировать 1 миллиард записей?
|
|||
---|---|---|---|
#18+
miltorg А дальше будет хуже или линейно будет рости? Я Вам сразу предлагал использовать триггер для выделения дупликатов. Но задачу Вы не озвучили толком. Если таблица пополняется регулярно и задача выделения дупликатов тоже регулярна, то триггер будет эффективней. Если задача разовая - то нет. Так же Вы не описали, какие ограничения на этот ряд чисел накладывается. Например, если числа ограничены 128 и всегда записаны по возрастанию, эффективней будет кодировать их битовой строкой длиной всего в 16 байт. И быстрее сравнивать. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2021, 13:10 |
|
Как отсортировать 1 миллиард записей?
|
|||
---|---|---|---|
#18+
miltorg Arhat109, Потому что брать нужно 10 цифр из строки. 10. В вашем варианте в строке 20 цифирек, а брать надо 10. В моем примере в строке 8 цифирек, а беру 4. Мне было лениво рисовать инсерт на 20 цифирек для каждой строки. Это как пример иного подхода к решению. Строку надо хранить в мускуле повдоль, а не поперек. Тогда можно группировать и считать итого.. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.01.2021, 13:11 |
|
|
start [/forum/topic.php?fid=47&msg=40034597&tid=1828220]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
46ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
55ms |
get tp. blocked users: |
2ms |
others: | 12ms |
total: | 155ms |
0 / 0 |