SXSSFWorkbook OutOfMemoryException накладные расходы GC на файл размером 26 МБ - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть файл Excel, который служит шаблоном для моей программы. Размер этого файла шаблона составляет около 26 МБ. Я пытаюсь открыть файл для записи с помощью этого кода:

Workbook workbook = new SXSSFWorkbook(new XSSFWorkbook(new File(getClass().getResource(TEMPLATE_PATH).getFile())),
                100, true, true);

Это, однако, вызывает следующее исключение:

java.lang.OutOfMemoryError: превышен предел накладных расходов GC при org.apache.xmlbeans.impl.store.Cur $ CurLoadContext.attr (Cur.java:3039) в org.apache.xmlbeans.impl.store.Locale.loadNode (Locale.java:1433) в org.apache.xmlbeans.impl.store.Locale.loadNodeChildren (Locale.java:1396) в org.apache.xmlbeans.impl.store.Locale.loadNode (Locale.java:1438) в org.apache.xmlbeans.impl.store.Locale.loadNodeChildren (Locale.java:1396) в org.apache.xmlbeans.impl.store.Locale.loadNode (Locale.java:1438) в org.apache.xmlbeans.impl.store.Locale.loadNodeChildren (Locale.java:1396) в org.apache.xmlbeans.impl.store.Locale.loadNode (Locale.java:1438) в org.apache.xmlbeans.impl.store.Locale.parseToXmlObject (Locale.java:1378) в org.apache.xmlbeans.impl.store.Locale.parseToXmlObject (Locale.java:1363) в org.apache.xmlbeans.impl.schema.SchemaTypeLoaderBase.parse (SchemaTypeLoaderBase.java:370) в org.apache.poi.POIXMLTypeLoader.parse (POIXMLTypeLoader.java:164) в org.openxmlformats.schemas.spreadsheetml.x2006.main.WorksheetDocument $ Factory.parse (Неизвестно Источник) в org.apache.poi.xssf.usermodel.XSSFSheet.read (XSSFSheet.java:226) в org.apache.poi.xssf.usermodel.XSSFSheet.onDocumentRead (XSSFSheet.java:218) в org.apache.poi.xssf.usermodel.XSSFWorkbook.parseSheet (XSSFWorkbook.java:443) в org.apache.poi.xssf.usermodel.XSSFWorkbook.onDocumentRead (XSSFWorkbook.java:408) в org.apache.poi.POIXMLDocument.load (POIXMLDocument.java:169) в org.apache.poi.xssf.usermodel.XSSFWorkbook. (XSSFWorkbook.java:270) в org.apache.poi.xssf.usermodel.XSSFWorkbook. (XSSFWorkbook.java:323) в com.company.project.writer.excel.AirlinesMasterWriter. (AirlinesMasterWriter.java:70) в com.company.project.business.controller.impl.DiioBCImpl.writeAirlinesMasterFile (DiioBCImpl.java:141) в sun.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод) в sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) в sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) в java.lang.reflect.Method.invoke (Method.java:498) в org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection (AopUtils.java:333) в org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint (ReflectiveMethodInvocation.java:190) в org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:157) в org.springframework.transaction.interceptor.TransactionInterceptor $ 1.proceedWithInvocation (TransactionInterceptor.java:99) в org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction (TransactionAspectSupport.java:280) в org.springframework.transaction.interceptor.TransactionInterceptor.invoke (TransactionInterceptor.java:96)

Как правильно писать в такие большие файлы Excel с помощью Apache Poi?


Обратите внимание, что я извлекаю все данные, которые мне нужно записать в шаблон, прежде чем открывать шаблон. Размер данных не более 300 МБ, скорее всего меньше. Также обратите внимание, что остальная часть моего кода работает нормально, если я создаю новый SXSSFWorkbook вместо открытия существующего.

...