Как я могу зациклить генератор в этой ситуации? - PullRequest
0 голосов
/ 18 июня 2019

Вот вопрос.

Я хочу использовать django bulk_create, чтобы сохранить больше данных одновременно.Но исходный результат, который я получаю от API - это генератор с количеством данных в нем.Поэтому я хочу зациклить этот генератор и сохранить данные.

Моя пробная версия была такой, как показано ниже:


#  a generator with amount data   
l = (
    item for item in range(1,100230, 1)
)

#  base model table
class ModelDemo(models.Model):
    ...


# main logic code

limit = 2000
while l:
    bulk_list = []
    for index, item in enumerate(l):
        bulk_list.append(
            ModelDemo(
                ...
            )
        )
        if index == limit:
            ModelDemo.objects.bulk_create(bulk_list)
            break

Очевидно, я бы потерял последние данные 230, но я не смог найтирешение к настоящему времени.

Любые комментарии очень приветствуются.большое спасибо.

Ответы [ 2 ]

1 голос
/ 18 июня 2019

Это может сработать.

Пример:

from itertools import chain, islice
l = (
    item for item in range(1,10230, 1)
)
limit = 2000

def chunks(iterable, size=10):
    iterator = iter(iterable)
    for first in iterator:
        yield chain([first], islice(iterator, size - 1))

data = chunks(l, limit)
while data:
    try:
        bulk_list = []
        for index, item in enumerate(next(data)):
            bulk_list.append(
                ModelDemo(
                    ...
                )
            )
        ModelDemo.objects.bulk_create(bulk_list)
    except:
        break

Ссылка

0 голосов
/ 18 июня 2019

Ах!Теперь я понимаю, в чем ваша проблема.

Все, что вам нужно сделать, это сделать окончательный вызов bulk_create после завершения цикла для обработки окончательного списка, который был слишком маленьким.

основной логический код

limit = 2000

bulk_list = []
for index, item in enumerate(l):
    bulk_list.append(
        ModelDemo(
            ...
        )
    )
    if index == limit:
        ModelDemo.objects.bulk_create(bulk_list)
        bulk_list.clear() # reset the batch

ModelDemo.objects.bulk_create(bulk_list)

Я не уверен, для чего был цикл while.И ты не должен ломаться.

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