在使用Java中的jMagick时,无法处理大于100M的PDF文件。

3

我正在使用jMagick处理上传的文件(图片和pdf文件)。大多数图像都可以正常处理,但是当我尝试将大型多页pdf文件转换为不同大小的图像时,系统内存消耗非常大(对于一个200M的pdf文件需要20G物理内存),最终失败了。由于图像质量太差,我甚至无法在输出图像中阅读单词,因此我将密度设置为200。以下是我的代码:

  ImageInfo info = new ImageInfo(inputFilePath);
  info.setDensity(200);
  MagickImage image = new MagickImage(info);
  MagickImage[] imageFrames = image.breakFrames();
  for (MagickImage frame : imageFrames) {
    ImageInfo frameInfo = new ImageInfo();
    MagickImage frameDisplay = frame;
    frameDisplay.setFileName(outputFile);
    frameDisplay.writeImage(frameInfo);
  }

在我的Java日志中没有错误或异常,我只是看到进程死亡了。我已经尝试使用位于 /usr/share/ImageMagick-6.5.4/config/ 的 policy.xml 来限制内存使用,方法如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE policymap [
<!ELEMENT policymap (policy)+>
<!ELEMENT policy (#PCDATA)>
<!ATTLIST policy domain (delegate|coder|filter|path|resource) #IMPLIED>
<!ATTLIST policy name CDATA #IMPLIED>
<!ATTLIST policy rights CDATA #IMPLIED>
<!ATTLIST policy pattern CDATA #IMPLIED>
<!ATTLIST policy value CDATA #IMPLIED>
]>

<policymap>
    <policy domain="resource" name="memory" value="256MB"/>
</policymap>

但是某种原因似乎无法工作。我正在使用ImageMagick-6.5.4版本。非常感谢任何建议!


"Does not work" 的意思是...... - thatidiotguy
JVM 重启了,没有保存任何需要转换的 PDF 图像。 - Roy Cheng
JVM 重新启动了?什么?你的程序崩溃了吗?如果是这样,请提供堆栈跟踪。 - thatidiotguy
请更新您的问题并提供所需信息:)。您已经很好地描述了您正在做什么,但是您缺少出现问题的信息。 - Rutix
非常抱歉造成困惑。我们正在使用Weblogic,因此日志中唯一的内容是该特定JVM的Weblogic节点已重新启动。同时,当我尝试在命令行中运行相同的200m文件转换命令时,进程在几分钟后被操作系统终止,没有任何错误消息,而我可以看到在处理期间30G的可用内存下降到约100M。 - Roy Cheng
你能否调整你的代码,让ImageMagick一次只考虑一个页面而不是整个文件? - mmgp
1个回答

2
<policymap>
    <policy domain="resource" name="memory" value="256MB"/>
</policymap>

尝试将此部分更新为:
<policymap>
    <policy domain="resource" name="memory" value="1000MB"/>
</policymap>

请再试一次。当你说“JVM重新启动”时,我假设你的意思是它崩溃了。可能是因为内存溢出异常(OutOfMemory)。根据你提供的信息,没有人能确定确切原因。


1
谢谢,让我试试。我也认为这应该是JVM OutOfMemory异常,所以我将JVM设置为:-Xms1024m -Xmx2048m但这似乎使问题变得更糟。Java进程仍然占用了30G内存,甚至导致Linux服务器崩溃。这就是为什么我想限制物理内存使用,即使这意味着镜像将在虚拟机中,可能会慢很多。 - Roy Cheng
@Amir 我也有这个怀疑 - thatidiotguy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接