Использование PyMongo в блокноте Jupyter Lab не приведет к закрытию соединения с сервером MongoDB - PullRequest
0 голосов
/ 14 мая 2018

Итак, я использую ноутбук Jupyter Lab для подключения к нашей производственной базе данных.После нескольких дней работы мы заметили, как сервер отображает сотни или сотни активных соединений с базой данных, перечисленных как установленные (с запущенным « netstat -na »).

Это ужасно плохо, и мы определили проблемы как возникающие из-за того, что ядро ​​python открывало соединения с сервером, фактически даже не закрывая их, даже если это было точно сказано.

Это отредактированоВерсия кода, которую мы используем для подключения к серверу, запускается в отдельной ячейке ноутбука, отделенной от другого кода.Мы выделили проблему и уверены, что она исходит из следующих строк кода:

client = MongoClient(url, maxIdleTimeMS=120000)
db = client["database"]
coll = db["data"]

query = # Our query
data = list(coll.find(query))

client.close()

Почему это происходит?Что мы делаем не так?Почему метод .close () фактически не закрывает соединение?

1 Ответ

0 голосов
/ 14 мая 2018

Я уже довольно давно пользуюсь MongoDB в нашей производственной среде и в прошлом сталкивался с такими проблемами. data = list(coll.find(query)) эта строка кода фактически материализует результаты запроса, который возвращает ваш курсор, и заставляет соединение оставаться живым. Результат запроса является генератором и должен использоваться как в цикле. Материализация курсора в list() приводит к тому, что все данные загружаются в память, что иногда приводит к сбою, в отличие от курсора, который указывает на первую запись в наборе результатов.

Вы можете просто выполнить следующую операцию с курсором:

for elem in cursor: do_something

и не требует вызова метода close()

Во-вторых, для Jupyter Notebooks вам необходимо прекратить сеанс после того, как вы закончили свою работу. Если это не будет сделано, ноутбук всегда будет поддерживать связь с MongoDB, поглощая ресурсы по пути.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...