#python #mongodb #pymongo #python-asyncio
#python #mongodb #пимонго #python-асинхронный
Вопрос:
Я новичок в MongoDB и pymongo
. У меня есть коллекция MongoDB, к которой я подключаюсь с помощью pymongo
. Средний размер документа составляет около 80 КБ, а общий размер коллекции — около 500 Мб. Коллекция содержит около 7000 документов, и для ее циклического просмотра требуется около 40 секунд, используя:
data = collection.find({})
for document in data:
pass
Это слишком долго для моего случая, так как мне нужно, чтобы оно всегда было меньше 30 секунд для любого размера коллекции.
Мне было интересно, могу ли я разделить итерацию на несколько циклов, а затем использовать asyncio
библиотеку Python, чтобы циклы могли выполняться одновременно. Например, я мог бы разделить курсор на 4 подгруппы, т. Е. От 0 до data.length/4, data.length/4 до data.length/4 * 2 и т.д. затем одновременно перебирать каждую группу, чтобы сократить время.
Я также не могу использовать list(data)
, потому что это сохранит документы в памяти, а моя оперативная память ограничена.
Комментарии:
1. Что вы пытаетесь сделать с коллекцией?
2. @MontgomeryWatts Мне нужно рассчитать некоторые значения, используя поля документа. Я не включил это в вопрос, потому что не думаю, что это необходимо для моего случая.
3. Вместо того, чтобы перебирать каждый документ в Python, вы могли бы вычислить то, что вам нужно, в одном запросе к базе данных, что было бы намного быстрее. Какие вычисления вы пытаетесь выполнить?
4. @MontgomeryWatts Я беру определенное поле из каждого документа, умножаю его на число, а затем помещаю этот документ в список.
5. В этом случае может быть проще использовать этап конвейера агрегации $project или $ addFields с оператором $multiply , чтобы выполнить всю работу за вас.
Ответ №1:
Я бы предложил попробовать стандартный модуль многопроцессорной обработки библиотеки: https://docs.python.org/3/library/multiprocessing.html
Вы можете разделить работу между процессами и получить повышение производительности.
Комментарии:
1. Хорошо, но я не совсем уверен, как разделить MongoDB
Collection
на более мелкие группы.2. Ознакомьтесь с документацией. Существует функция с именем Pool.map, которая будет обрабатывать разделение итерации по нескольким процессам. Так что вам не придется беспокоиться о том, чтобы разбить его на части самостоятельно.
3. Хорошо, я посмотрю на это. Спасибо.