【问题标题】:Using parallelism to generate a large number of PDF files in UNIX在 UNIX 中使用并行生成大量 PDF 文件
【发布时间】:2015-07-23 15:34:56
【问题描述】:

所以最终我需要在 UNIX 服务器上的磁盘上编写大量 PDF(40,000 个),并且我正在尝试找出一种有效地执行此操作的方法(更快/消耗更少的内存)。

我一直在使用 JasperReports 创建一个模板,该模板接收作为参数(意味着报告没有进入数据库)报告所需的所有信息。

然后我有一个简单的 Java 应用程序,它可以查询数据库并带来数据集,并为每条记录填充 .jasper 并将 PDF 写入磁盘。

现在这适用于几百条记录,但我认为它不适用于数量扩展到 40.000 条记录并且该过程的输出将是相同数量的 PDF 文件的生产。做一些测试,我估计这个过程至少需要 3 个小时,而且我也开始担心内存消耗。

所以我想知道是否有一种有效的方法可以做到这一点:

  • 我应该为此进程使用并行性/多线程吗?
  • 谁能给我指点这类工作的已知模式/示例?

感谢您的宝贵时间

【问题讨论】:

  • 你说“更快/更少的内存”。通常很难同时实现两者。另外,请参阅how to ask a good question 上的指南
  • 一个注释,多线程!= 更快

标签: java unix jasper-reports


【解决方案1】:

不幸的是,您不能使用更少的内存并使用多线程来渲染不同的 PDF,每个线程都会分配内存来处理其 PDF,内存使用量与线程数成线性关系。 如果您可以使用多个线程处理相同的 PDF(相同的数据),那将是一个完全不同的故事,但我认为这并不容易,因为线程需要频繁同步,这使得多线程毫无意义。

如果他们不需要共享任何信息,实现多线程将是微不足道的,你可以实现Runnable接口,创建新线程传递Runnable的实现,并等待它们以Thread.join()结束。

如果我是你,我会使用 jasper virtualizer 当时只加载数据集的一部分,这可能允许你使用多个线程。

【讨论】:

  • 是的,这就是我最终要做的,但我没有自己处理线程创建,而是使用这篇文章stackoverflow.com/a/7966732/4524542 中描述的 ExecutoService。感谢您的回答,我将研究 Jasper Virtualizer 来处理大型数据集。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-03
  • 2013-12-18
  • 2013-05-12
  • 2018-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多