Hello.
Thanks for advices.
Crash occures, when I run Django command through python manage.py
my_command_name.
It doesn't relate to nginx and even gunicorn, because, again, it's Django
command, which I call from shell.
I switched off redis caching (I use cacheops), but it' didn't help too.
пятница, 7 октября 2016 г., 13:21:48 UTC+5 пользователь Горобец Дмитрий
написал:
>
> Hello.
>
> I have VPS with 2Gb RAM with django, gunicorn, mysql, nginx and redis.
>
> My app crashes with out of memory error, when I run django command on
> model, which has approximately 7 million records. It takes each premise
> object and updates one field by checking value with regular expression.
> Please, help optimize that command.
>
> class Command(BaseCommand):
> help = 'Updates premise.number_order'
>
> def handle(self, *args, **options):
> for premise in Premise.objects.iterator():
> premise.number_order = premise.set_number_order()
> premise.save()
>
> self.stdout.write('Finished')
>
>
> # Method of Premise model
> def set_number_order(self):
> tr = {
> 'А': '.10',
> 'A': '.10',
> 'Б': '.20',
> 'В': '.30',
> 'Г': '.40',
> 'Д': '.50',
> 'Е': '.60',
> 'Ж': '.70',
> 'З': '.80',
> 'И': '.90',
> }
>
> only_digit = re.compile(r'^(?P<number>[0-9]{1,9})$')
> digit_with_separator =
> re.compile(r'^(?P<number>[0-9]{1,9})(?P<separator>[-|/])(?P<rest>\w+)$')
> digit_with_letter =
> re.compile(r'^(?P<number>[0-9]{1,9})(?P<letter>[А-Яа-я]+)')
> result = 0
> title = self.title.strip().upper()
>
> if only_digit.match(title):
> number = only_digit.match(title).group('number')
> result = number + '.00'
>
> elif digit_with_separator.match(title):
> number = digit_with_separator.match(title).group('number')
> rest = digit_with_separator.match(title).group('rest')
> if rest[0].isalpha():
> floating = tr.get(rest[0], '.90')
> result = number + floating
>
> elif rest[0].isdigit():
> try:
> if rest[1].isdigit():
> result = number + '.{}'.format(rest[:2])
> else:
> result = number + '.0{}'.format(rest[0])
> except IndexError:
> result = number + '.0{}'.format(rest[0])
>
> elif digit_with_letter.match(title):
> number = digit_with_letter.match(title).group('number')
> letter = digit_with_letter.match(title).group('letter')[0]
>
> floating = tr.get(letter, '.90')
> result = number + floating
>
> return Decimal(result)
>
--
You received this message because you are subscribed to the Google Groups
"Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/django-users.
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-users/2e87323c-294c-4b82-89dd-783e36e23291%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.