我編寫了一個用於管理和運行Jasper報告的Web應用程序。最近,我一直在處理一些報告,這些報告會生成非常大的(1500+頁)輸出,並試圖解決由此產生的內存問題。我發現了JRFileVirtualizer
,這讓我能夠以非常有限的內存佔用情況成功運行報告。但是,我的應用程序的一個特點是它存儲以前運行的報告的輸出文件,並允許將它們導出爲各種格式(PDF,CSV等)。因此,我發現自己處於擁有500 + MB .jrprint文件並希望將其導出爲例如CSV的需求的情況。下面是一些簡單的例子代碼:Jasper在導出時報告OutOfMemoryError
JRCsvExporter exporter = new JRCsvExporter();
exporter.setParameter(JRExporterParameter.INPUT_FILE_NAME, jrprintPath);
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, outputStream);
exporter.exportReport();
不幸的是,當我嘗試這對我提到的大文件,我得到一個OutOfMemoryError
:
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)
...
從瀏覽一些碧玉內部的,它看起來像無論我如何嘗試設置此導出(我也嘗試直接加載並設置JASPER_PRINT
參數),最終都會調用JRLoader.loadObject(...)
,這會嘗試將我的整個500MB報告加載到內存中(請參閱net.sf.jasperreports.engine.JRAbstractExporter.setInput()
)。
我的問題是,有沒有辦法解決這個問題? 500MB是可行的,但它並沒有離開我的應用程序非常面向未來的,並報告執行JRVirtualizer
溶液離開我希望有將用於出口類似的東西。我願意讓自己的手變髒,並擴展一些Jasper內部類,但理想的解決方案將由Jasper自己提供,理由很明顯。
1500+頁的報告,這是如此之大,它是無用的。也許考慮打破這些報告。 –
不幸的是,這是一個使用通用工具出於許多不同目的的情況。此報告(CSV格式)通過腳本導入到另一個數據庫中,而不是由人類瀏覽。 – Eric
我已經用JasperSoft提交了一個功能請求,因爲它看起來像項目預算約束會阻止我尋求像下面這樣建議的更復雜的解決方案。 http://jasperforge.org/projects/jasperreports/tracker/view.php?id=5478 – Eric