Как я могу разделить итерацию курсора MongoDB на несколько циклов в Python?

#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. Хорошо, я посмотрю на это. Спасибо.