генерация больших файлов с использованием apache camel и freemarker

#apache-camel #out-of-memory #freemarker #apache-karaf #blueprint-osgi

#apache-camel #нехватка памяти #freemarker #апачи-караф #план -osgi

Вопрос:

в настоящее время я сталкиваюсь с проблемой нехватки памяти, когда пытаюсь сгенерировать большой файл, используя freemarker размером> 300 МБ. (это хорошо работает для небольших файлов)

 <to  uri="freemarker:file:{{karaf.home}}/etc/fileGenerator.ftl" />
 

есть ли способ избежать этой проблемы?
моя конфигурация: Apche karaf 4.2.6: 4 ГБ памяти

 Caused by: java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOf(Arrays.java:3332) ~[?:?]
    at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:124) ~[?:?]
    at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:596) ~[?:?]
    at java.lang.StringBuffer.append(StringBuffer.java:367) ~[?:?]
    at java.io.StringWriter.write(StringWriter.java:94) ~[?:?]
    at java.io.Writer.write(Writer.java:127) ~[?:?]
    at freemarker.core.TextBlock.accept(TextBlock.java:67) ~[?:?]
    at freemarker.core.Environment.visit(Environment.java:330) ~[?:?]
    at freemarker.core.Environment.visit(Environment.java:372) ~[?:?]
    at freemarker.core.IteratorBlock$IterationContext.executedNestedContentForCollOrSeqListing(IteratorBlock.java:317) ~[?:?]
    at freemarker.core.IteratorBlock$IterationContext.executeNestedContent(IteratorBlock.java:271) ~[?:?]
    at freemarker.core.IteratorBlock$IterationContext.accept(IteratorBlock.java:242) ~[?:?]
    at freemarker.core.Environment.visitIteratorBlock(Environment.java:642) ~[?:?]
    at freemarker.core.IteratorBlock.acceptWithResult(IteratorBlock.java:107) ~[?:?]
    at freemarker.core.IteratorBlock.accept(IteratorBlock.java:93) ~[?:?]
    at freemarker.core.Environment.visit(Environment.java:330) ~[?:?]
    at freemarker.core.Environment.visit(Environment.java:336) ~[?:?]
    at freemarker.core.Environment.visit(Environment.java:372) ~[?:?]
    at freemarker.core.IteratorBlock$IterationContext.executedNestedContentForCollOrSeqListing(IteratorBlock.java:317) ~[?:?]
    at freemarker.core.IteratorBlock$IterationContext.executeNestedContent(IteratorBlock.java:271) ~[?:?]
    at freemarker.core.IteratorBlock$IterationContext.accept(IteratorBlock.java:242) ~[?:?]
    at freemarker.core.Environment.visitIteratorBlock(Environment.java:642) ~[?:?]
    at freemarker.core.IteratorBlock.acceptWithResult(IteratorBlock.java:107) ~[?:?]
    at freemarker.core.IteratorBlock.accept(IteratorBlock.java:93) ~[?:?]
    at freemarker.core.Environment.visit(Environment.java:330) ~[?:?]
    at freemarker.core.Environment.visit(Environment.java:372) ~[?:?]
    at freemarker.core.IteratorBlock$IterationContext.executedNestedContentForCollOrSeqListing(IteratorBlock.java:317) ~[?:?]
    at freemarker.core.IteratorBlock$IterationContext.executeNestedContent(IteratorBlock.java:271) ~[?:?]
    at freemarker.core.IteratorBlock$IterationContext.accept(IteratorBlock.java:242) ~[?:?]
    at freemarker.core.Environment.visitIteratorBlock(Environment.java:642) ~[?:?]
    at freemarker.core.IteratorBlock.acceptWithResult(IteratorBlock.java:107) ~[?:?]
    at freemarker.core.IteratorBlock.accept(IteratorBlock.java:93) ~[?:?]
 

Комментарии:

1. Типичная ошибка, которую совершают люди, — это передача StringWriter в FreeMarker, а затем сохранение результата String в a File , вместо прямой передачи a FileWriter в FreeMarker. Но я не знаю, применимо ли это здесь. Например, что вызывает FreeMarker?

2. Не могли бы вы опубликовать точную трассировку стека исключений из журнала?

3. @MattPavlovich я добавил исключение к своему вопросу

4. @ddekany я не понял вашего вопроса: (

5. Из трассировки стека проблема в том, что я подозревал в своем комментарии. То есть результат записывается в StringWriter . Я не уверен, что это был Camel, который передал это Writer FreeMarker. Пожалуйста, проверьте. Это должен быть вызов Template.process или Environment.process , и он должен быть дальше в трассировке стека.