LINUX.ORG.RU

Оптимизировать следующий код

 


1

1

Excel файл, 1.5 млн строк.

def read_excel():
  wb = openpyxl.load_workbook('users.xlsx')
  sheet = wb.active
  data = [ (sheet[f'A{i}'].value,
            sheet[f'B{i}'].value,
            sheet[f'C{i}'].value,
            sheet[f'D{i}'].value,
            sheet[f'E{i}'].value,
            sheet[f'F{i}'].value,
            sheet[f'G{i}'].value) for i in range(2, 1500002) ]

На чтение уходит много времени.

Перемещено a1batross из web-development



Последнее исправление: VolanQ (всего исправлений: 1)

Юзай xlrd, не юзай форматирование строк на каждый чих и всё будет чуть быстрее.

1.5 млн строк

Ну и формат ты выбрал…

x3al ★★★★★
()
Ответ на: комментарий от x3al

Формат не от меня зависит

Файл открывается около минуты. Его отдает другая система. Нужно потом в бд загрузить этот список для дальнейших действий.

VolanQ
() автор топика
Ответ на: Формат не от меня зависит от VolanQ

Файл открывается около минуты

Фича xlrd (но можно использовать ленивую загрузку). Емнип, xlrd дольше загружает, но прочитать весь файл — быстрее, чем в openpyxl.

x3al ★★★★★
()
Ответ на: Форматирование строк? от VolanQ

О чем речь?

1 500 000 раз сделать f’A{i}’, а потом внутри openpyxl распарсить это как row=0, col=0 — небесплатно, хотя на фоне парсинга xml на каждый чих в openpyxl может быть незаметно.

x3al ★★★★★
()
Ответ на: комментарий от peregrine

файл

А если в файле несколько листов и нужно обработать сначала 1 млн в одном строк и еще лям в другом?

VolanQ
() автор топика
Ответ на: файл от VolanQ

Тогда, сохранить в несколько csv (так как csv это 1 лист) и тем более обрабатывать при помощи pandas-а.

peregrine ★★★★★
()

Так ведь решение простое - не читай Excel и проблемы не будет. Как тут верно советует, переведи сначала на CSV и уже потом пихай все в свою преогромнейшую переменную. Впрочем, это еще один твой косяк, серьезные мужики так не делают. Обрабатывай построчно.

anonymous
()

Если позарез нужно xlsx, и вариант с csv не годится, то расскажи что именно ты хочешь сделать. Представленный тобой код — глупый и бессмысленный.

WitcherGeralt ★★
()
Последнее исправление: WitcherGeralt (всего исправлений: 1)
Ответ на: комментарий от WitcherGeralt

Задача

В excel список идентификаторов пользователей. Листов(в одном файле) может быт несколько. Нужно написать веб приложение, которое разбирает такие файлы(с указанием пользователем листов и колонки с айди). После залить результат в бд. По этим пользователям(идетификаторам) найти информацию какими услугами они пользуются и вывести абонентскую плату. На выходе результат сохранить в excel файл.

VolanQ
() автор топика
Ответ на: Задача от VolanQ

В excel

Точнее надо быть xls != xlsx. Хочешь быстрее - пользуй unzip и xml-парсер.

anonymous
()
Ответ на: Формат не от меня зависит от VolanQ

Попробуй напрямую в pandas и из него в csv конвертнуть, а в бд уже саму csv грузить load data local infile, если есть такая возможность. Это самый быстрый вариант скорее всего будет.

evgeny_aa ★★☆
()
Последнее исправление: evgeny_aa (всего исправлений: 1)
Ответ на: Задача от VolanQ

В общем случае это выглядело как-то так (пока не буду заикаться о подводных камней одновременного выполнения той же задачи двумя разными пользователями):

1 - Нормализация. Приведи Excel файл в формат, удобный для быстрого применения дальнейших пунктов. Например, во временный CSV файл. 2 - Валидация и санитизация. Убедись, что данные именно то, что тебе надо, без сюрпризов. Выбрось все, что не нужно для дальнейшего выполнения задачи. 3 - Сегментация. Наведи порядок в данных так, чтоб их можно было выполнять маленькими транзакциями. Например, временная таблица в базе данных, по которой удобно выполнять запросы. 4 - Транзакции. Последовательно обработай сегменты, выполнив нужные операции для каждого ID пользователя и сохранив данные прямо в базу данных или временный файл. 5 - Консолидация. Создай нужный файл и записи в базе данных, сообщи об ошибках. 5 - Зачистка. Убери все временное.

Конечно, совсем не обязательно каждый пункт сегрегировать. Наиболее вероятно, что тебе достаточно:

  1. Перевести нужные листы из Excel в CSV, создать или очистить (вдруг там от куда то появился хлам?) временные таблицы в базе данных.
  2. Отправить CSV файл прямиком в временную таблицу. Например, https://dev.mysql.com/doc/refman/8.0/en/load-data.html
  3. Сохранить в временную таблицу данные по абонентной плате для каждого пользователя, получив ее GROUP BY запросом из временной таблицы в пункте 2.
  4. Создать нужный Excel файл и в одной транзакции записи из временных таблиц отправить в таблицы для хранения.
  5. Почистить за собой - убрать временные файлы и временные таблицы или данные в них.
anonymous
()
Ответ на: Задача от VolanQ

Если у тебя есть машина с виндой и excel, то у excel-а есть способ дергать его через COM. Но это если тебе нужна прямо 100% поддержка формата excel и особенностей проприетарного офиса из винды.

peregrine ★★★★★
()
Ответ на: комментарий от anonymous

Ой, бля, больше пьяным в форум писать не буду. С употреблением интернациональных слов такая чепуха получилась… :(

anonymous
()

Оптимизировать следующий код

import pandas as pd

aquadon ★★★★★
()
  1. Настоятельно советую все-таки экспортнуть в csv, но если сложно то забей;

  2. Читай файл паралельно в несколько потоков и тут же шли в базу;

  3. В базу вставляй batch запросами и коммить транзакции каждые 1000 строк.

cocucka ★★★★☆
()

.xlsx

В техподдержку микрософта уже звонили?

anonymous
()

Pandas кстати xlrd использует для excel. И там надо имена страниц указывать

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.