Openpyxl огромное потребление оперативной памяти при сохранении, а для сохранения файла требуется много времени - PullRequest
0 голосов
/ 30 августа 2018

Я пытаюсь автоматизировать генерацию некоторых отчетов. Моим первым подходом было прочитать файл csv с обновленными данными, а затем с помощью панд сгенерировать весь Excel с помощью сводных таблиц.

Это была не лучшая идея из-за сложности отчетов, поэтому я решил, что буду использовать базовый шаблон и помещать обработанные данные в лист в новый файл на основе шаблона. Этот подход работал хорошо, за исключением того, что он требует слишком много ресурсов (оперативной памяти и времени), но до сегодняшнего дня, когда я получил «ошибку памяти», это не было проблемой.

После поиска решения я обнаружил объем данных, которые я выгружал, и сам шаблон был основной причиной проблемы.

Вот упрощенный подход к тому, что я сейчас делаю:

# Load the data
data = pd.read_csv(data_path)

# Do some processing to agregate data
processed_data = process_data(data)

# Open the template
wb = load_workbook(template_path, keep_vba=True)

# Copy to the template the processed data
processed_data_rows = dataframe_to_rows(processed_data, index=False)

ws = self.wb['data']
        for r_idx, row in enumerate(processed_data_rows, 1):
            for c_idx, value in enumerate(row, 1):
                if value is None:
                    ws.cell(row=r_idx, column=c_idx, value='')
                else:
                    ws.cell(row=r_idx, column=c_idx, value=value)

# Save the data to the new file
wb.save(path)

В своем поиске я обнаружил, что могу использовать некоторые оптимизации чтения / записи с read_only и write_only, но не смог найти способ скопировать листы из загруженного шаблона в отчет Excel, который я создаю в новом файле .

Есть идеи, как решить эту проблему?

PS: загруженный CSV - это около 30 тыс. Строк и 140 столбцов.

Редактировать: Размер выходного файла составляет около 12 МБ (даже близко к 1,80 ~ 2,3 ГБ, который использует скрипт)

...