Не удается обработать большой файл PDF (более 100 МБ) при использовании jMagick в Java.

Я использую jMagick для java для обработки загруженных файлов (изображений и файлов PDF). Большинство изображений работают нормально, но когда я попытался преобразовать большие многостраничные pdf-файлы в изображения разного размера, он потреблял очень большой объем системной памяти (около 20 ГБ физической памяти для 200-мегапиксельных pdf-файлов) и в конечном итоге потерпел неудачу. Я устанавливаю плотность на 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 нет ошибок или исключений, я просто вижу, что процесс умер. Я попытался использовать policy.xml в /usr/share/ImageMagick-6.5.4/config/, чтобы ограничить использование памяти следующим образом:

<?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. Очень ценю любые советы!


person Roy Cheng    schedule 14.12.2012    source источник
comment
Не работает значит....   -  person thatidiotguy    schedule 15.12.2012
comment
JVM перезапущена, а не какое-либо изображение, сохраненное из pdf, которое необходимо преобразовать.   -  person Roy Cheng    schedule 15.12.2012
comment
JVM перезапущен? Какая??? Вы имеете в виду, что ваша программа потерпела крах? Если да, трассируйте стек, пожалуйста   -  person thatidiotguy    schedule 15.12.2012
comment
И, пожалуйста, обновите свой вопрос с запрошенной информацией :). Вы предоставили прекрасное описание того, что вы делаете, но вам не хватает информации о том, что идет не так.   -  person Rutix    schedule 15.12.2012
comment
Конечно, извините за путаницу. Я использую weblogic, поэтому единственное, что у нас есть в журнале, это перезапуск узла weblogic для этой конкретной JVM. В то же время, когда я попытался просто запустить команду convert из командной строки с тем же 200-мегабайтным файлом, процесс был остановлен ОС через несколько минут без каких-либо сообщений об ошибках, в то время как я вижу, что свободная память с 30 ГБ упала примерно до 100 МБ. в течение этого времени обработки.   -  person Roy Cheng    schedule 15.12.2012
comment
Разве вы не можете настроить свой код так, чтобы ImageMagick рассматривал только одну страницу за раз, а не весь файл сразу?   -  person mmgp    schedule 15.12.2012


Ответы (1)


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

Попробуйте обновить этот раздел до:

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

и попробуй еще раз. Я предполагаю, что когда вы сказали «JVM перезапущена», вы имеете в виду, что она потерпела крах. Вероятно, OutOfMemory исключение. Никто не может сказать наверняка по предоставленной вами информации.

person Amir Afghani    schedule 14.12.2012
comment
Спасибо, позвольте мне попробовать это. Я думал, что это также должно быть исключение JVM OutOfMemory, поэтому я устанавливаю JVM как: -Xms1024m -Xmx2048m Но это, кажется, даже усугубляет проблему. Процесс Java по-прежнему занимал 30 ГБ памяти, и событие привело к сбою сервера Linux. Вот почему я хочу ограничить использование физической памяти, даже если это означает, что образ будет в виртуальной машине, поэтому, возможно, он будет немного медленным. - person Roy Cheng; 15.12.2012
comment
@ Амир, я тоже подозреваю - person thatidiotguy; 15.12.2012