|
Быстро посчитать расстояние между точками в пространстве?
|
|||
---|---|---|---|
#18+
Всем привет, есть трекер, который пишет координаты объекта в трех плоскостях, записей очень много, хочется найти оптимальный и максимально быстрый способ посчитать расстояние пройдённое объектом, для пример взял 200 строк: x y z-16613 124065 -3112-11953 123486 -3088-14690 121010 -2984-14325 126532 -3144-16612 124288 -3112-11991 123485 -3088-14684 121045 -2984-16587 124302 -3112-14037 126499 -3144-14012 126595 -3144-16665 124311 -3112-14693 121040 -2984-11973 123494 -3088-11957 123496 -308849367 121509 -5408-11938 123765 -3080-16636 124307 -3112-16636 124325 -3112-14693 121088 -2992-11950 123506 -3088-14032 126548 -3144-14033 126478 -3144-21390 181128 -5728-14686 121031 -2984-14738 120968 -298445430 122117 -5408114686 48690 -4528114478 48551 -4552114661 48660 -4536114673 48689 -4528125401 43021 -3584124835 50042 -358451710 121948 -540882179 67459 -298449375 121525 -5408119052 115553 -375253543 172825 -497653544 172795 -4976107950 179212 -367253550 172778 -497653588 172748 -4976173670 17874 -341648205 177711 -497617387 111481 -658418878 112592 -6584176776 -119657 -4096123140 135084 -4824168204 27270 -3664115847 14804 1944117042 15826 1944116685 16375 1944168230 28582 -360875166 78399 -5274116821 16763 1944116642 16380 194482407 80890 -512082376 80427 -5120115890 13959 1944-14620 121425 -2984-14587 121346 -2984-12287 123551 -308897508 -18680 -275280932 53075 -156081621 56200 -152081601 56196 -152096136 -22502 -2288116950 16616 194481627 56232 -152081605 56200 -152097091 -18435 -274480923 53092 -156081590 56232 -152081600 56212 -152081615 56201 -152081629 56195 -152081606 56207 -152081619 56200 -152080961 53047 -156018335 145735 -310481602 56210 -152080947 53075 -156017946 145593 -308018617 145272 -3112-16283 124129 -3112-14515 121315 -2984-14645 121381 -2984-14593 121332 -2984-14594 121323 -2984-14623 121373 -2984-14656 121342 -2984-14623 121273 -2984-14576 121319 -2984-14592 121128 -2984-14534 121300 -298410300 189025 -3712125415 43023 -3584-54650 83727 -344046548 176249 -4976143960 86870 -5424100061 -20209 -3040-14470 123855 -3112-14483 123769 -3112-14499 123799 -3112-14519 123748 -3112-14499 123685 -311282167 81004 -512082295 81221 -5120-14563 121712 -3000143957 86866 -5424108566 25942 -348097408 -19548 -2696-14396 123838 -3112-14466 123821 -3112-14534 121679 -3000-14370 123045 -3112-14380 123241 -3112-14596 121698 -3000-14337 123895 -3112-14519 121657 -300057011 18784 -5160-14348 123693 -3112-14445 123760 -3112-14487 122051 -3048-15399 123877 -3112-14494 123738 -3112-14704 122032 -3048-14542 122818 -3112-14415 123623 -3112-14542 122796 -3112-14420 122547 -3112-14376 123875 -3112-14469 123209 -3112-14399 124009 -3112-14510 123706 -3112-14677 122159 -3064-14258 123428 -3112-14683 121945 -3032-14608 122014 -3048-14448 121885 -3032-14572 122551 -3112-14487 123742 -3112-15113 124027 -3112-15314 124131 -3112-15926 124044 -311267534 39959 -3712-23994 181232 -5600172700 -214552 -3528173651 -214543 -356871343 125512 -3584175320 29581 -3728171327 12722 -2696112700 210803 -3680-45725 110923 -3800115346 13774 598480663 82252 -512029763 107490 -3712-22290 152045 -3064-22093 152044 -3056181480 -114281 -608065592 38303 -3792-16225 124219 -3112-14115 126280 -3136-14632 121424 -2984-18155 -102115 -2088-45352 111231 -3800-14125 126331 -3136-14568 121355 -2984-14568 121335 -2984-12230 123563 -3088-14146 126354 -3136-12272 123529 -3088-14553 121288 -2984-14128 126202 -3136-14578 121348 -2984-12922 137979 -3616-14189 126176 -3136-16288 124268 -3112-14646 121403 -2984143959 86864 -542482840 251836 -10592115263 74388 -2608182835 61373 -3992115320 74445 -2608116122 77654 -2696116350 77368 -2712116450 78038 -2680116374 77891 -2680118099 76109 -2688116327 77834 -2672119812 157815 -3736119559 157737 -3736118128 75966 -2688119626 157559 -3736119927 157787 -3736118001 75978 -2688116230 77773 -2680116296 77682 -2696119458 156696 -3736119525 157083 -3736116575 78214 -2640 Вариант с последовательным сравнением каждой строки со следующей и вычисления расстояния между этими точками - первое что приходит в голову. Но боюсь, что на больших объемах - этот вариант будет поглощать огромное количество мощностей. Кто-то может знаком с более оптимальными алгоритмами? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.10.2021, 14:35 |
|
Быстро посчитать расстояние между точками в пространстве?
|
|||
---|---|---|---|
#18+
teCa, это решает архитектурно элементарно. Трекер пишет координаты и сразу же рассчитывается расстояние пройденное от предъидущей точки. "Утяжеление" очень небольшое в моменте выходит. Потом когда надо суммируете эти расстояния и всё. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.10.2021, 14:52 |
|
Быстро посчитать расстояние между точками в пространстве?
|
|||
---|---|---|---|
#18+
Подскажите, возможно ли произвести расчет расстояний использую оконную функцию? Не имею опыта работы с оконными функциями, но изучив вопрос не могу понять как мне применить этот алгоритм к моей задаче. Я создал функцию для расчета расстояния, в функцию передаю 6 значений (x1,y1,z1,x2,y2,z2) Код: sql 1.
Получаю расстояние. Как мне использовать эту функцию в связке с оконной функцией? Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
... |
|||
:
Нравится:
Не нравится:
|
|||
12.10.2021, 15:47 |
|
Быстро посчитать расстояние между точками в пространстве?
|
|||
---|---|---|---|
#18+
Вот так обсчитал: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
... |
|||
:
Нравится:
Не нравится:
|
|||
12.10.2021, 16:09 |
|
Быстро посчитать расстояние между точками в пространстве?
|
|||
---|---|---|---|
#18+
teCa, как вариант - добавить в таблицу триггер, который будет вычислять разницу между предыдущими координатами и теми, что сохраняются в таблице. Каждая строка координат должна быть пронумерована, расстояния лучше сохранять в отдельную таблицу со связью 1 к 1. Дельта расстояний = sqrt(dx^2+dy^2+dz^2). Для поиска пути на любом произвольном отрезке достаточно просуммировать дельты. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.10.2021, 16:50 |
|
Быстро посчитать расстояние между точками в пространстве?
|
|||
---|---|---|---|
#18+
Владислав Колосов teCa, как вариант - добавить в таблицу триггер, который будет вычислять разницу между предыдущими координатами и теми, что сохраняются в таблице. Каждая строка координат должна быть пронумерована, расстояния лучше сохранять в отдельную таблицу со связью 1 к 1. Дельта расстояний = sqrt(dx^2+dy^2+dz^2). Для поиска пути на любом произвольном отрезке достаточно просуммировать дельты. Что бы не замедлять вставку, я же могу настроить репликацию транзакций этой таблицы и на реплике повесить такой триггер, в таком случае вставка останется быстрой. Я ничего не упускаю? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.10.2021, 16:56 |
|
Быстро посчитать расстояние между точками в пространстве?
|
|||
---|---|---|---|
#18+
А зачем скалярная функция? Чтобы было как можно медленнее? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.10.2021, 17:30 |
|
Быстро посчитать расстояние между точками в пространстве?
|
|||
---|---|---|---|
#18+
teCa Владислав Колосов teCa, как вариант - добавить в таблицу триггер, который будет вычислять разницу между предыдущими координатами и теми, что сохраняются в таблице. Каждая строка координат должна быть пронумерована, расстояния лучше сохранять в отдельную таблицу со связью 1 к 1. Дельта расстояний = sqrt(dx^2+dy^2+dz^2). Для поиска пути на любом произвольном отрезке достаточно просуммировать дельты. Что бы не замедлять вставку, я же могу настроить репликацию транзакций этой таблицы и на реплике повесить такой триггер, в таком случае вставка останется быстрой. Я ничего не упускаю? Если сильно хочется оптимизировать, сделайте брокерскую очередь+сервис и там считайте. А репликация добавит сильно много сущностей. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.10.2021, 17:43 |
|
Быстро посчитать расстояние между точками в пространстве?
|
|||
---|---|---|---|
#18+
teCa, Я рекомендую посмотреть два направления 1) Сразу при поступления записи инкрементить расстояние 2) Делать это на языке программирования высокого уровня, ибо на уровне БД это будет медленнее (вопрос лишь в том, как быстром можно прочитать записи) И посмотрите базу данных MapD -- она должна быть заточена под такие задачи. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.10.2021, 17:50 |
|
Быстро посчитать расстояние между точками в пространстве?
|
|||
---|---|---|---|
#18+
a_voronin teCa, Я рекомендую посмотреть два направления 1) Сразу при поступления записи инкрементить расстояние 2) Делать это на языке программирования высокого уровня, ибо на уровне БД это будет медленнее (вопрос лишь в том, как быстром можно прочитать записи) И посмотрите базу данных MapD -- она должна быть заточена под такие задачи. Даладно, чтобы посчитать sqrt(dx^2+dy^2+dz^2) - начинать городить такие сложности? Я написал уже выше: брокер и достаточно. Если сильно хочется можно прилепить редис сбоку, но для такого примитивного расчета должно хватит SQL Server и его базы, и нечего услжнять. Так мне имхуется. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.10.2021, 17:58 |
|
Быстро посчитать расстояние между точками в пространстве?
|
|||
---|---|---|---|
#18+
Ролг Хупин a_voronin teCa, Я рекомендую посмотреть два направления 1) Сразу при поступления записи инкрементить расстояние 2) Делать это на языке программирования высокого уровня, ибо на уровне БД это будет медленнее (вопрос лишь в том, как быстром можно прочитать записи) И посмотрите базу данных MapD -- она должна быть заточена под такие задачи. Даладно, чтобы посчитать sqrt(dx^2+dy^2+dz^2) - начинать городить такие сложности? Я написал уже выше: брокер и достаточно. Если сильно хочется можно прилепить редис сбоку, но для такого примитивного расчета должно хватит SQL Server и его базы, и нечего услжнять. Так мне имхуется. Брокер -- самое медленное решение из возможных. А самое быстрое -- это GPU. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.10.2021, 18:06 |
|
Быстро посчитать расстояние между точками в пространстве?
|
|||
---|---|---|---|
#18+
Норм движуха пошла давай запилим кластер кафки, микросервисы на питоне под опеншифт, хранить в кластере кликхауса а тупой джоб не сможет досчитывать по регламенту свежеприбывшее? можно с inmemory поразвлекаться, нативной компиляцией.. или надо модно-стильно-молодежно из кучи разнородного хлама, чтобы потом страдать, эксплуатируя этот "самолёт с бассейном, казино и пр." в продакте? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.10.2021, 18:20 |
|
Быстро посчитать расстояние между точками в пространстве?
|
|||
---|---|---|---|
#18+
а пространственные типы и функции не помогут? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.10.2021, 21:24 |
|
Быстро посчитать расстояние между точками в пространстве?
|
|||
---|---|---|---|
#18+
a_voronin Ролг Хупин пропущено... Даладно, чтобы посчитать sqrt(dx^2+dy^2+dz^2) - начинать городить такие сложности? Я написал уже выше: брокер и достаточно. Если сильно хочется можно прилепить редис сбоку, но для такого примитивного расчета должно хватит SQL Server и его базы, и нечего услжнять. Так мне имхуется. Брокер -- самое медленное решение из возможных. А самое быстрое -- это GPU. п-ц, извините, вырвалось ... |
|||
:
Нравится:
Не нравится:
|
|||
13.10.2021, 11:21 |
|
Быстро посчитать расстояние между точками в пространстве?
|
|||
---|---|---|---|
#18+
andy st Норм движуха пошла давай запилим кластер кафки, микросервисы на питоне под опеншифт, хранить в кластере кликхауса а тупой джоб не сможет досчитывать по регламенту свежеприбывшее? можно с inmemory поразвлекаться, нативной компиляцией.. или надо модно-стильно-молодежно из кучи разнородного хлама, чтобы потом страдать, эксплуатируя этот "самолёт с бассейном, казино и пр." в продакте? тупой джоб не понимает, какая версия сервера у ТС, похоже даже и сам ТС не понимает, что такое версия сервера. Такие временища ... |
|||
:
Нравится:
Не нравится:
|
|||
13.10.2021, 11:25 |
|
Быстро посчитать расстояние между точками в пространстве?
|
|||
---|---|---|---|
#18+
teCa, авторЧто бы не замедлять вставку, я же могу настроить репликацию транзакций этой таблицы Как частный случай, можно настроить CDC для таблицы и написать обработчик. Но я уверен, что триггер +индекс + запись в отдельную таблицу заметно не замедлит производительность. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.10.2021, 12:27 |
|
|
start [/forum/topic.php?fid=46&msg=40103860&tid=1684208]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
156ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
others: | 258ms |
total: | 514ms |
0 / 0 |