В настоящее время у меня есть следующий фрагмент кода:
houses = self.database[self.database_name][constants.DATABASE_HOUSES_COLLECTION]
bulk_houses = houses.initialize_unordered_bulk_op()
for house in houses.find().skip(self.from_index).limit(
constants.MAX_HOUSE_FUNCTION_DOCUMENTS_PER_THREAD):
house_coords = (house.get("longitude"), house.get("latitude"))
min = 10000
for c in self.collection.find({"city": house.get("city")}, {"longtitude": 1, "latitude": 1}):
collection_coords = (c.get("longitude"), c.get("latitude"))
distance = geopy.distance.distance(collection_coords, house_coords).km
if distance < min:
min = distance
if min == 10000:
min = None
bulk_houses.find({"_id": house.get("_id")}).update(
{"$set": {f"demography.distanceClosest{translated.get(self.collection.name)}": min}})
bulk_houses.execute()
Что он делает, он проходит по каждому дому в коллекции домов.
Для каждого дома он проходит по второй коллекции это было дано и только захватывает долготу и широту.
Он вычисляет ближайшее расстояние в пределах одного и того же города.
Эта функция является многопоточной, я вызываю функцию следующим образом:
houses_count = self.houses.count_documents({})
for i in range(len(self.collections)):
x = 0
while x < houses_count:
match_demography_house = MatchDemographyHouse(self.collections[i], self.mongo_db,
constants.DATABASE_NAME, x,
x + constants.MAX_HOUSE_FUNCTION_DOCUMENTS_PER_THREAD)
match_demography_house.add_to_pool(self.match_house_demography_executor)
x += constants.MAX_HOUSE_FUNCTION_DOCUMENTS_PER_THREAD
И, как вы можете себе представить, это очень неэффективно. Добавление указателя на город улучшило скорость незначительно, а также только захват долготы и широты немного увеличил скорость.
Для 1000 домов требуется 1 минута до go, и в коллекции, в которой она проходит, 240 документов. В настоящее время он делает 50 домов на поток.