Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.12.2018, 18:29   #1
Anton_Jag
Пользователь
 
Регистрация: 05.11.2009
Сообщений: 41
По умолчанию 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, 07:25   #2
strannik
python developer
Пользователь Подтвердите свой е-майл
 
Аватар для strannik
 
Регистрация: 30.11.2006
Сообщений: 81
По умолчанию

Может лучше в цикле проверять на существование записи в базе. Если нет то добавлять в базу.
Код:
for row in ws.iter_rows(row_offset=1):
    if not Parameter.objects.filter(здесь параметры проверки).exist()
        parameter = Parameter()
        ...
        parameter.save()
И отказаться от списков data и data_par
Границы расширяет тот, кто выходит за них.
strannik вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка в Django fsgod:// Общие вопросы Web 1 03.06.2017 19: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 02:25
как присвоить значение ячейки R1C1 из 1.xls, допустим какой-нибудь любой ячейке из 2.xls ? diabloskrk Microsoft Office Excel 3 08.10.2007 12:27