Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Скриптовые языки программирования > 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


04:40.


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

RusProfile.ru


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