Мне нужно создать более 100 страниц PDF-документов. Этот процесс требует обработки большого количества данных, а генерация «все сразу» требует больше времени и памяти, чем я могу выделить.
Однако я пробовал несколько разных способов взломать свой путь:
- xhtml2pdf с созданием и преобразованием HTML
- rportlab для создания некоторых страниц и
- pyPdf для объединения
С разным результатом я заработал, но он медленный и занимает больше памяти, чем должен (иногда достигая предела мягкой памяти экземпляра). В настоящее время я создаю несколько разделов в разных задачах, сохраняя каждый в blobstore, и объединяю их с pyPdf, но он задыхается от больших документов.
Документ, который я создаю, не такой сложный, в основном таблицы и текст, без внутренних ссылок, без оглавления, без чего-либо, что должно быть известно об остальной части документа. Я могу жить с утконосом для верстки, и мне не нужен причудливый вид документа или преобразование HTML2PDF.
Цель состоит в том, чтобы сгенерировать документ настолько быстро, насколько это позволит хранилище данных. Параллельная генерация страниц была бы хороша, но не обязательна.
Я думал о постраничном создании с помощью api файлов blobstore, где каждая задача будет генерировать одну страницу, а последняя задача будет завершать файл blobstore, делая его доступным для чтения. Но я не могу найти, как приостановить создание, сохранить частичный PDF-файл в поток и возобновить создание с этим потоком для создания следующей страницы в другой задаче.
Итак, мой вопрос:
Как в GAE создать PDF-документ объемом более нескольких страниц, разделив генерацию между запросами задач, а затем сохранить полученный документ в хранилище больших двоичных объектов?
Если разделение генерации невозможно с помощью reportlab, то как минимизировать объем объединения различных PDF-документов, чтобы он соответствовал ограничениям, установленным запросом задачи GAE?
ОБНОВЛЕНИЕ: альтернативы Conversion API приветствуются.
Второе ОБНОВЛЕНИЕ Conversion API выводится из эксплуатации, поэтому сейчас это не вариант.
3-е ОБНОВЛЕНИЕ Могут ли здесь помочь API Pileline или MapReduce?
multiprocessing.Pool.map
для параллельного запуска списка фрагментов всех ваших входных данных. В качестве последнего шага используйте pyPdf, чтобы объединить страницы в один документ. - person Roland Smith   schedule 22.04.2012