При использовании функции, в основе которой лежит db.collection.find({})
, в цикле наблюдаю, что он начинает замедлятся, а процесс mongodb использует все больше памяти. Пример:
def find_person(data): host='***' table_name='***' mng_client = pymongo.MongoClient(host, 27017) mng_db = mng_client['local'] db_cm = mng_db[table_name] df= pd.DataFrame() for i in ["", "_rus"]: d = db_cm.find({ 'first_name': proccess_name(data['firstname'+i]), 'last_name': proccess_name(data['lastname'+i]), }, {'_id':0,'id':1}) df=df.append(pd.DataFrame(list(d))) mng_client.close() return df for i in range(0, len(client_data)): find_person(client_data.iloc[i])
Прошу помочь решить проблему.
Анонимный пользователь Изменен статус публикации
Попробуйте использовать мап редюс Пример для вашего случая
mapper = """ function map() { if((this.last_name '%s' & this.first_name == '%s') | (this.last_name == '%s_rus' & this.first_name == '%s_rus')){ emit(this._id,{'some_return_var':this.some_var, ...}); } } """ reducer = """ function reduce(key, values) { } """ result_set = self.mongo[self.collection_name].map_reduce(mapper, reducer, out='Названия промежуточной колекции куда он будет ложить найденые данные')
После в result_set.find( вы получаете лист словарей по типу {'_id': 'UUID внутрених документов в колекциях', 'values': 'значения которые вы указали для возврата в маппере.'}
В моем случае выборка по тайм стампу в колекции с 150к документов происходит за «буквально в щелчек пальцев»
Есть проблема что в разных потоках вызов мап-редюса будет ложить в одну промежуточную колекцию утраняется это , и вызвать наложение документов
def _map_reduce(self, mapper, reducer): self.result_collection = uuid.uuid4().__str__() result_set = self.mongo[self.collection_name].map_reduce(mapper, reducer, out=SON( [("replace", self.result_collection), ("db", MONGODB_NAME)])) l = list() for doc in result_set.find(): l.append(doc) self.mongo[self.result_collection].drop() return l