2017-11-28 74 views
1

큰 PDF (20,000+ 페이지)의 모든 페이지를 검토하는 코드가 있고 해당 페이지에 특정 문자열이 포함되어 있으면 가져옵니다 해당 페이지를 다른 PDF로 인해 발생의 수에PDFBox 2.0.3/Java 7 - 한 페이지에서 다른 페이지로 페이지를 가져올 때의 OOM 오류

, 그것은으로 수입되고있는 PDF는 원본 PDF만큼이나 큰 성장 - 그것은 아래를 제외하고 밖으로 너무 큰, 그것은 폭탄을 얻을 때 : 내가 가지고있는

Exception in thread "main" java.lang.OutofMemoryError: Java heap space 
at java.utils.Arrays.copyOf (Unknown Source) 
at java.io.ByteArrayOutputStream.toByteArray (Unknown Source) 
at org.apache.pdfbox.cos.COSOutputStream.close(COSOutputStream.java:87) 
at java.io.FilterOutputStream.close(Unknown Source) 
at org.apache.pdfbox.cos.COSStream$1.close(COSStream.java:223) 
at org.apache.pdfbox.pdmodel.common.PDStream.<init>(PDStream.java:138) 
at org.apache.pdfbox.pdmodel.common.PDStream.<init>(PDStream.java:104) 
at org.apache.pdfbox.pdfmodel.PDDocument.importPage(PDDocument.java:562) 
at ExtractPage.extractString(ExtractPage.java:57) 
at RunApp.run(RunApp.java:15) 

문제를 조사하고 스트리밍을위한 임시 파일을 사용하는 것이 내 문제를 해결할 수있는 것처럼 보입니다. 그러나, 난 그냥 내 코드에 그것을 구현하는 방법을 해결할 수 없습니다.

내가 페이지를 별도의 파일로 배치 한 다음 나중에 언급 된 soultion을 사용하여 작업을 병합합니다. here - 그러나이를 피하기 위해서는 확실하고 확실한 방법이 될 것입니다.

아래의 내 코드의 요약 참조하십시오 : 그것은 7000 정도 페이지의 주위에 내 보낸 후

File sourceFile = new File (C:\\Temp\\extractFROM.pdf); 
PDDocument sourceDocument = PDDocument.load(SourceFile, MemoryUsageSetting.setupTempFileOnly(); 
PDPageTree sourcePageTree = sourceDocument.getDocumentCatalog().getPages(); 
PDDocument tempDocument = new PDDocument (MemoryUsageSetting.setupTempFileOnly()) 

for (PDPage page : sourcePageTree) { 
// Code to extract page text and confirm if contains String 
if (above psuedo code is true) { 
tempDocument.importPage(page); 
} 
} 

tempDocument.save(sourceFile); 

을, 그건 때 tempDocument.importPage (페이지) 라인에서 그것을 밖으로 폭탄. 이 번호 아래의 PDF는 완벽하게 작동합니다.

누구든지 도와 줄 수 있습니까?

+0

프로그램에 메모리를 할당 해 보았습니까? – mkl

+0

2.0.8을 사용해 보셨습니까? –

+0

@TilmanHausherr - 나는 2.0.8을 얻을 수 없다. 왜냐하면 나는 클라이언트를 위해 PDFBox를 사용하고 있으며, 소싱 측면에서 약간 뒤떨어져있다. 따라서, 2.0.3으로 고정되어있다. –

답변

1

OutofMemoryError으로 실행되는 프로그램은 메모리 누수가 있거나 올바르게 실행하려면 더 많은 메모리가 필요할 수 있습니다.

따라서 이러한 상황에서 시도 할 수있는 변화 중 하나는 프로그램에 할당 된 메모리를 단순히 늘리는 것입니다. 프로그램이 문제없이 실행되면 문제를 해결할 수 있습니다. 연산이

내가 670메가바이트에 실행 구성으로 힙을 증가 확인 된만큼 할당 된 메모리가 완전히 무리가되지 않는 한, 즉 ...

이, 여기에 사건을 것으로 보인다 (최대 클라이언트 장비로 확보 할 수 있습니다) 그리고 이것은 성공적으로 문제를 해결했습니다 - 사실, 나는 원래 PDF 실패 크기의 두 배로 PDF에서 그것을 시도하고, 쉽게 이것을 잘 관리했습니다.

+0

더 많은 정보를 제공하기 위해, 나는이 전에 메모리 누수에 직면 해 있고 힙을 늘리지 않고 문제를 해결할 수 있었다. 그러나, 나는 며칠 동안이 문제를 해결해 왔으며 문제를 해결할 해결책을 찾지 못했습니다. 또한 내 JVM에는 최대 256MB의 기본 설정이 있기 때문에 작업중인 PDF의 크기를 고려해 볼 때 낙담 한 것은 아닙니다. –