Оптимизировать поиск ближайшего соседа
Я пытаюсь найти всех ближайших соседей, которые находятся в радиусе 1 км. Вот мой скрипт для построения дерева и поиска ближайших точек,
from pysal.cg.kdtree import KDTree
def construct_tree(s):
data_geopoints = [tuple(x) for x in s[['longitude','latitude']].to_records(index=False)]
tree = KDTree(data_geopoints, distance_metric='Arc', radius=pysal.cg.RADIUS_EARTH_KM)
return tree
def get_neighbors(s,tree):
indices = tree.query_ball_point(s, 1)
return indices
#Constructing the tree for search
tree = construct_tree(data)
#Finding the nearest neighbours within 1KM
data['neighborhood'] = data['lat_long'].apply(lambda row: get_neighbors(row,tree))
Из того, что я прочитал на странице писала, написано:
KD-дерево построено на основе функциональности KD-дерева в Scipy. Если используется scipy 0.12 или выше, используется scipy.spatial.cKDTree, в противном случае используется scipy.spatial.KDTree.
В моем случае это должно быть использование cKDTree. Это нормально работает для образца набора данных, но так как tree.query_ball_point
возвращает список показателей в результате. Каждый список будет иметь сотни элементов. Для моих точек данных (2 миллиона записей) это становится все больше и больше и останавливается из-за проблемы с памятью после определенного момента. Есть идеи, как это решить?
1 ответ
На всякий случай, если кто-то ищет ответ на этот вопрос, я решил его, найдя ближайших соседей для группы (tree.query_ball_point может обрабатывать пакеты) и записав в базу данных, а затем обработав следующую группу, вместо того чтобы хранить все в памяти. Благодарю.