Загрузка ЦП 100% при использовании OpenOffice4
Я пытаюсь конвертировать документы (.docx/.xlsx/.pptx) в PDF с помощью JOD Converter. Я использую OpenOffice 4.1.2 на Centos 7. Моя проблема в том, что я получаю постоянную загрузку ЦП на 100% во время конвертации файла, и это влияет на производительность всей машины. Я перепробовал все возможные варианты в параметрах командной строки, но, к сожалению, не смог смягчить эту проблему. Я искал на многих форумах и обнаружил, что многие другие люди также сталкиваются с той же проблемой, однако, там нет решения. Из моих чтений я понимаю, что это может быть связано с проблемами утечки памяти в OpenOffice. Может кто-нибудь помочь мне решить или хотя бы смягчить это?
Ниже приведена команда, которую я использую для запуска экземпляра OpenOffice.
/opt/openoffice4/program/soffice.bin -accept=socket,host=127.0.0.1,port=8016;urp; -env:UserInstallation=file:///tmp/.jodconverter_socket_host-127.0.0.1_port-8016 -headless -nocrashreport -nodefault -nofirststartwizard -nolockcheck -nologo -norestore
Код, который я использую для преобразования файлов, выглядит следующим образом: package org.samples.docxconverters.jodconverter.pdf;
import java.io.File;
import org.apache.commons.io.FilenameUtils;
import org.artofsolving.jodconverter.OfficeDocumentConverter;
import org.artofsolving.jodconverter.office.DefaultOfficeManagerConfiguration;
import org.artofsolving.jodconverter.office.OfficeManager;
public class Word2PdfJod {
public static void main(String[] args) {
// 1) Start LibreOffice in headless mode.
OfficeManager officeManager = null;
try {
officeManager = new DefaultOfficeManagerConfiguration()
.setOfficeHome(new File("/Applications/OpenOffice.app/Contents/")).buildOfficeManager();
officeManager.start();
// 2) Create JODConverter converter
OfficeDocumentConverter converter = new OfficeDocumentConverter(
officeManager);
// 3) Create PDF
createPDF(converter);
} finally {
// 4) Stop OpenOffice in headless mode.
if (officeManager != null) {
officeManager.stop();
}
}
}
private static void createPDF(OfficeDocumentConverter converter) {
try {
long start = System.currentTimeMillis();
String src_file = "/Users/Aman/Documents/WindowsData/DocumentConversionPoc/Powerpoint2Pdf/JODConverterV3/Sample_pptx_files/AdeemSample2.pptx";
System.out.println(src_file.substring(0, src_file.lastIndexOf(".")) + "_" + FilenameUtils.getExtension(src_file) );
//Actual Conversion
converter.convert( new File(src_file), new File( src_file.substring(0, src_file.lastIndexOf(".")) + "_"
+ FilenameUtils.getExtension(src_file) +"_Jod.pdf") );
System.out.println("Time Taken in conversion - "+ (System.currentTimeMillis() - start) + "ms");
} catch (Throwable e) {
e.printStackTrace();
}
}
}
А соответствующие банки можно скачать по адресу: https://drive.google.com/file/d/0B4hS5IGxGOh9OE5Ca0RlbTdVclU/view?usp=sharing
2 ответа
Если процессор не используется, процесс по умолчанию займет 100% процессорного времени. Это нормально. Если это вызывает помехи при выполнении других процессов (крайне маловероятно), вы можете установить приоритеты, используя nice
,
nice <your command>
Или вы можете установить cpulimit
, который переводит вашу программу в спящий режим, если она достигает предустановленной загрузки ЦП. Читайте об этом здесь.
Сокращая количество ядер, которые может использовать ваше приложение, вы можете предотвратить блокировку системы:
Process.GetCurrentProcess().ProcessorAffinity = (System.IntPtr)2;