Jasper informa OutOfMemoryError en la exportación

He escrito una aplicación web para administrar y ejecutar informes de Jasper. Últimamente he estado trabajando con algunos informes que generan resultados extremadamente grandes (más de 1500 páginas), e intentando resolver los problemas de memoria resultantes. He descubierto laJRFileVirtualizer, lo que me ha permitido ejecutar el informe con éxito con una huella de memoria muy limitada. Sin embargo, una de las características de mi aplicación es que almacena archivos de salida de informes ejecutados anteriormente y permite exportarlos a varios formatos (PDF, CSV, etc.). Por lo tanto, me encuentro en la situación de tener un archivo .jrprint de 500+ MB y querer exportarlo, por ejemplo, a CSV a pedido. Aquí hay un código de ejemplo simplificado:

JRCsvExporter exporter = new JRCsvExporter();
exporter.setParameter(JRExporterParameter.INPUT_FILE_NAME, jrprintPath);
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, outputStream);
exporter.exportReport();

esafortunadamente, cuando intento esto en el archivo grande que mencioné, obtengo unOutOfMemoryError:

Caused by: java.lang.OutOfMemoryError: GC overhead limit exceeded
    at java.io.ObjectInputStream$HandleTable.grow(ObjectInputStream.java:3421)
    at java.io.ObjectInputStream$HandleTable.assign(ObjectInputStream.java:3227)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1744)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
    at java.util.ArrayList.readObject(ArrayList.java:593)
    at sun.reflect.GeneratedMethodAccessor184.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:974)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1849)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
    at net.sf.jasperreports.engine.base.JRVirtualPrintPage.readObject(JRVirtualPrintPage.java:423)
    ...

Desde la exploración de algunas de las partes internas de Jasper, parece que no importa cómo intente configurar esta exportación (también he intentado cargar y configurar elJASPER_PRINT parámetro directamente), finalmente habrá una llamada aJRLoader.loadObject(...) que intentará cargar todo mi informe de 500 MB en la memoria (consultenet.sf.jasperreports.engine.JRAbstractExporter.setInput()).

Mi pregunta es, ¿hay alguna forma de evitar esto que no implique simplemente arrojar memoria al problema? 500 MB es factible, pero no deja mi aplicación a prueba de futuro, y elJRVirtualizera solución @ para la ejecución del informe me deja esperando que haya algo similar para la exportación. Estoy dispuesto a ensuciarme las manos y extender algunas de las clases internas de Jasper, pero la solución ideal sería la que brinda Jasper, por razones obvias.

Respuestas a la pregunta(2)

Su respuesta a la pregunta