Мне нужно оценивать около 80 тыс. Строк данных каждый день в 11 утра, и я надеюсь выполнить sh в течение нескольких минут.
Я использовал многопоточность, которая использует select_for_update () из Django, что получает по одной строке за раз, обновляет ее, а затем получает новую строку.
Проблема в том, что существует проблема, при которой счетчик увеличивается слишком быстро, предполагая, что в некоторых случаях строка оценивается дважды .
Вот мой текущий блок кода:
while True:
with transaction.atomic():
user_history = UserHistory.objects.select_for_update().filter(is_finished=False).first()
if user_history:
user = UserProfile.objects.filter(id=user_history.user_profile_id).first()
card_today = CardToday.objects.filter(id=user_history.card_today_id).first()
rewarded_value = 0
if user_history is item1:
if card_today.item1 > card_today.item2:
rewarded_value = card_today.item2/card_today.item1 + 1
elif user_history is item2:
if card_today.item2 > card_today.item1:
rewarded_value = card_today.item1/card_today.item2 + 1
user.coins += float(user.coins) + rewarded_value # the value increases too high here
user.save()
user_history.save()
else
break
Это модель для Card Today:
class CardToday(models.Model):
item1 = models.IntegerField(default=0)
item2 = models.IntegerField(default=0)
Это модель для истории пользователей:
class UserHistory(models.Model):
card_today = models.ForeignKey(CardToday, on_delete=models.CASCADE)
answer_item = models.ForeignKey(Item, on_delete=models.CASCADE)
is_finished = models.BooleanField(default=False) // checks whether the card has already been evaluated.
вычисление вознагражденного значения выполняется следующим образом:
rewarded_value = majority/minority + 1
переключение большинства и меньшинства в зависимости от того, какой элемент имеет большее значение.
Каждый user_history может выбирать только из item1 или item2.
По прошествии определенного времени код определит, какой предмет был выбран в CardToday.
Есть ли лучший способ сделать это?
фреймворк, который я использую - Django, и из библиотеки django -cron выполняется задание cron.