Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.
Внимание! Некоторое время письма не доходят до аккаунтов MAIL RU GROUP, не доходят на все почтовые ящики mail.ru, inbox.ru, bk.ru. Пишите им жалобы, чтобы быстрее восстановили получение писем, регистрируйтесь через яндекс почту и gmail, туда письма с активизацией доходят.

Вернуться   Форум программистов > Скриптовые языки программирования > Python
Регистрация

Восстановить пароль
Повторная активизация e-mail

Ответ
 
Опции темы
Старый 06.12.2018, 19:29   #1
Anton_Jag
Пользователь
 
Регистрация: 06.11.2009
Сообщений: 31
Репутация: 10
По умолчанию Django парсинг xls в sqlite

В xls более 400000 строк, данные нужно раскидать в несколько таблиц.
В таблицу Parameter нужно вносить только уникальные записи, в связи с чем организована проверка. Но с проверкой работает очень долго и кончается это ERR_CONNECTION_RESET. Без проверки данных загружает за 5 минут. Есть какие нибудь способы ускорить проверку?
Код:

def handle_parameters_upload(request, file):

    wb = openpyxl.load_workbook(file, read_only=True)
    first_sheet = wb.get_sheet_names()[0]
    ws = wb.get_sheet_by_name(first_sheet)

    recipe, created = Recipe.objects.get_or_create(par_recipe=ws["B2"].value)

    line, created = Line.objects.get_or_create(par_machine=ws["C2"].value)

    order, created = Order.objects.get_or_create(par_fa=ws["D2"].value)

    Measurements.objects.all().delete()
    Parameter.objects.all().delete()

    data = []
    data_par = []
    _id = 1
    for row in ws.iter_rows(row_offset=1):
        parameter = Parameter()
        parameter.id_parameter = _id
        _id += 1
        parameter.par_rollennr = row[5].value
        parameter.par_definition_id = row[6].value
        parameter.par_name = row[7].value
        # parameter = check_parameter(parameter, data_par)
        try:
            parameter = data_par[data_par.index(parameter)]
        except ValueError:
            pass
        data_par.append(parameter)

        measurements = Measurements()
        measurements.par_value = row[8].value
        measurements.line = line
        measurements.order = order
        measurements.parameter = parameter
        measurements.recipe = recipe

        data.append(measurements)

        if _id % 100000 == 0:
            Parameter.objects.bulk_create(data_par)
            Measurements.objects.bulk_create(data)
            data_par = []
            data = []
    else:
        Parameter.objects.bulk_create(data_par)
        Measurements.objects.bulk_create(data)
    return True


def check_parameter(parameter, data_par):
    for data in data_par:
        if data.get_data() == parameter.get_data():
            return data
    return parameter

models.py
Код:

class Parameter (models.Model):
    id_parameter = models.IntegerField(primary_key=True)
    par_rollennr = models.IntegerField(default=0)
    par_definition_id = models.IntegerField(default=0)
    par_name = models.CharField(max_length=200)

    def get_data(self):
        return self.par_rollennr, self.par_definition_id, self.par_name

    def __ex__(self, other):
        if self.par_rollennr != other.par_rollennr:
            return False
        if self.par_definition_id != other.definition_id:
            return False
        if self.par_name != other.par_name:
            return False
        return True

Anton_Jag вне форума   Ответить с цитированием
Старый 07.12.2018, 08:25   #2
strannik
python developer
ФорумчанинФорумчанин
 
Аватар для strannik
 
Регистрация: 30.11.2006
Сообщений: 71
Репутация: 64
По умолчанию

Может лучше в цикле проверять на существование записи в базе. Если нет то добавлять в базу.
Код:

for row in ws.iter_rows(row_offset=1):
    if not Parameter.objects.filter(здесь параметры проверки).exist()
        parameter = Parameter()
        ...
        parameter.save()

И отказаться от списков data и data_par
__________________
Границы расширяет тот, кто выходит за них.
strannik вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка в Django fsgod:// Общие вопросы Web 1 03.06.2017 20:04
макрос различает .xls и .XLS БАХТИ Microsoft Office Excel 7 26.09.2011 18:16
django-php: PHP в шаблонах Django rei_desu PHP 0 07.08.2011 05:16
xls-> xls с измененными полями falcon-x Общие вопросы C/C++ 1 22.01.2008 03:25
как присвоить значение ячейки R1C1 из 1.xls, допустим какой-нибудь любой ячейке из 2.xls ? diabloskrk Microsoft Office Excel 3 08.10.2007 12:27


10:12.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru