Как пролистать oop через миллионы Django объектов модели, не выходя за пределы диапазона или других ошибок - PullRequest
0 голосов
/ 16 апреля 2020

У меня есть миллионы объектов в базе данных Postgres, и мне нужно отправлять данные от 200 из них за раз в API, что даст мне дополнительную информацию (API может обрабатывать до 200 элементов за раз время). Я перепробовал несколько стратегий. Первая стратегия закончилась тем, что мой скрипт был убит, потому что он занимал слишком много памяти. Эта попытка ниже работала лучше, но я получил следующую ошибку: django .db.utils.DataError: bigint вне диапазона. Эта ошибка произошла, когда переменная «start» достигла 42 000. Каков более эффективный способ выполнить эту задачу? Спасибо.

articles_to_process = Article.objects.all() # This will be in the millions
dois = articles_to_process.values_list('doi', flat=True) # These are IDs of articles

start = 0
end = 200 # The API to which I will send IDs can only return up to 200 records at a time.
number_of_dois = dois.count()
times_to_loop = (number_of_dois / 200) + 1

while times_to_loop > 0:
     times_to_loop = times_to_loop - 1
     chunk = dois[start:end]
     doi_string = ', '.join(chunk)
     start = start + 200
     end = end + 200

     [DO API CALL, GET DATA FOR EACH ARTICLE, SAVE THAT DATA TO ARTICLE]

1 Ответ

0 голосов
/ 16 апреля 2020

Рассмотрите возможность использования итератор :

chunk_size = 200
counter = 0
idx = []
for article_id in dois.iterator(chunk_size):
    counter += 1
    idx.append(str(article_id))
    if counter >= chunk_size:
        doi_string = ', '.join(idx)
        idx = []
        counter = 0
        # DO API CALL, GET DATA FOR EACH ARTICLE, SAVE THAT DATA TO ARTICLE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...