Большие PDF-файлы занимают экспоненциально больше времени с ReportLab

Я использую ReportLab для создания отчетов в формате PDF, и ниже приведен код для того же. Проблема в том, что для X страниц требуется T времени, но для 2X страниц требуется намного больше, чем 2T времени. Поскольку мне нужно создавать PDF-файлы, которые могут доходить до 35000 страниц, это большая проблема. Что я могу сделать, чтобы обойти эту проблему.

from reportlab.platypus import TableStyle, SimpleDocTemplate, LongTable, Table
from reportlab.lib.pagesizes import letter

class JournalPDFGenerator(object):
    """
    Generates Journal PDF with ReportLab
    """

    def __init__(self, pdf_name, profile_report_id):
        self.pdf_name = pdf_name
        self.profile_report_id = profile_report_id
        self.profile_report = ProfileWatchReport.objects.get(id=self.profile_report_id)
        self.document = SimpleDocTemplate(self.pdf_name, pagesize=letter)
        self.story = []

    def get_prepared_rows(self):
        row = [your_mark_details, threat_mark_details]
        yield row

    def generate_pdf(self):
        report_table = LongTable([row for row in self.get_prepared_rows()])
        self.story.append(report_table)
        self.document.build(self.story)

person yadavankit    schedule 13.03.2019    source источник
comment
Вы предприняли какие-либо измерения, чтобы увидеть, где в коде происходит задержка?   -  person Endre Both    schedule 13.03.2019
comment
Да, self.document.build(self.story) занимает 99% всего рабочего времени.   -  person yadavankit    schedule 13.03.2019


Ответы (2)


Я потратил много времени, чтобы найти причину проблемы выше. Вместо LongTable можно попробовать использовать мой класс BigDataTable, оптимизированный для обработки больших данных.

GIST BigDataTable быстрее LongTable на больших данных

Протестировано с 6500 строками и 7 столбцами:

  • LongTable: > 1 час общего времени обработки документа.
  • BigDataTable: ~ 24,2 секунды от общего времени обработки сборки документа.
person Dmitry Shost    schedule 17.12.2019

35 000 страниц — это не совсем обычное использование PDF, поэтому любые сбои не являются совершенно неожиданными. Несколько идей для изучения:

  • Возможно, у машины просто закончилась оперативная память, связанная с объемом данных, и обновление оборудования может помочь.
  • Вы можете попробовать разделить данные на несколько таблиц, а не на одну большую, чтобы посмотреть, улучшит ли это производительность.
  • Можно ли разделить содержимое либо временно (чтобы собрать его обратно в один файл с помощью другого инструмента, такого как GhostScript), либо навсегда на несколько файлов?
  • Можно ли самостоятельно обрабатывать нумерацию страниц (например, если длина элементов контента предсказуема)? Может быть (а может и не быть), что нумерация страниц очень больших таблиц выходит из-под контроля.
  • Вы можете попробовать протестировать структуру данных, отличную от LongTable, которая имеет ту же длину, чтобы проверить, связана ли проблема с этой конкретной структурой; если это; можно найти альтернативу.
  • Наконец (или сначала, в зависимости от вашего желания), вы можете изучить соответствующий код и/или задать вопрос команде ReportLab.
person Endre Both    schedule 13.03.2019