2015-05-12 2 views
0

Так что в конечном итоге мне нужно написать большое количество PDF-файлов (40 000) на диске на сервере UNIX, и я пытаюсь найти способ сделать это эффективно (быстрее/потребляет меньше памяти).Использование параллелизма для создания большого количества PDF-файлов в UNIX

Я использую JasperReports для создания шаблона, который получает в качестве параметров (что означает, что отчет не попадает в базу данных) всю информацию, необходимую для отчета.

Тогда у меня есть простое Java-приложение, которое запрашивает базу данных и приносит набор данных, и для каждой записи он заполняет .jasper и записывает PDF на диск.

Теперь это работает отлично для нескольких сотен записей, но я думаю, что он не будет работать для производства, где число масштабируется до 40 000 записей, а выход процесса будет равным числом PDF-файлов. Выполняя некоторое тестирование, я оцениваю, что процесс займет не менее 3 часов, и я также начинаю беспокоиться о потреблении памяти.

Так что я хотел бы знать, если есть эффективный способ сделать это:

  • Должен ли я использовать параллелизм/несколько потоков для этого процесса?
  • Может ли кто-нибудь указать мне на образец knonw/пример для такого рода работ?

Спасибо за ваше время

+0

Вы говорите «быстрее/меньше памяти». Часто бывает трудно добиться того и другого. Также см. Рекомендации по [как задать хороший вопрос] (http://stackoverflow.com/help/how-to-ask) – screenmutt

+0

Просто примечание, несколько потоков! = Быстрее – user489041

ответ

0

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

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

Если бы я был вами, я бы использовал jasper virtualizer для загрузки только части набора данных в то время, это, вероятно, позволит вам использовать несколько потоков.

+0

Да, это то, что я закончил делать но вместо обработки создания потоков я использую ExecutoService, как описано в этом сообщении http://stackoverflow.com/a/7966732/4524542. Спасибо за ваш ответ, я рассмотрю Jasper Virtualizer для обработки большого набора данных. – gafemoyano

Смежные вопросы