У меня есть 4-мерные точки данных, хранящиеся в моей базе данных MySQL
на сервере. Данные одного временного измерения с тремя пространственными данными GPS (широта, долгота, альт). Данные GPS сэмплируются по 1 минуте для тысяч пользователей и добавляются на мой сервер 24x7.
Пример REST / post json выглядит так:
{
"id": "1005",
"location": {
"lat":-87.8788,
"lon":37.909090,
"alt":0.0,
},
"datetime": 11882784
}
Теперь мне нужно отфильтровать всех кандидатов (userID
), чьи позиции находились на расстоянии k метров от заданного userID
в течение заданного периода времени.
Пример параметров запроса REST / get для фильтрации выглядит следующим образом:
{
"id": "1001", // user for whose we need to filter out candidates IDs
"maxDistance":3, // max distance in meter to consider (euclidian distance from users location to candidates location)
"maxDuration":14 // duration offset (in days) from current datetime to consider
}
Как видим, тысячи записей вставляются в мою базу данных в минуту, что приводит к огромному количеству записей. Таким образом, чтобы перебрать все записи для фильтрации, я боюсь, что тривиальный наивный подход не будет выполним для моего текущего требования. Итак, какой алгоритм я должен реализовать на сервере? Я пытался реализовать наивный алгоритм, такой как
params ($uid, $mDis, $mDay)
1. Init $candidates = []
2. For all the locations $Li of user with $uid
3. For all locations $Di in database within $mDay
4. $dif = EuclidianDis($Li, $Di)
5. If $dif < $mDis
6. $candidates += userId for $Di
7. Return $candidates
Однако на практике этот подход очень медленный. И предварительный расчет может оказаться невозможным, поскольку он требует огромного пространства для всех userID
с. Какой еще алгоритм может повысить эффективность?