У меня возникли проблемы с разбором файлов .xlsx
с Apache POI - я получаю java.lang.OutOfMemoryError: Java heap space
в моем развернутом приложении. Я обрабатываю файлы только под 5 МБ и около 70 000 строк, поэтому мое подозрение от чтения других вопросов - это то, что что-то не так.Apache POI гораздо быстрее использует HSSF, чем XSSF - что дальше?
Как было предложено в this comment Я решил запустить SSPerformanceTest.java
с предлагаемыми переменными, поэтому, если что-то не так с моим кодом или настройкой. Результаты показывают значительную разницу между HSSF (.xls
) и XSSF (.xlsx
):
1) HSSF 50000 50 1: Прошедшее 1 секунды
2) SXSSF 50000 50 1: Прошедшее 5 секунд
3) XSSF 50000 50 1: Прошедшее 15 секунд
FAQ специфически говорит:
If you can't run that with 50,000 rows and 50 columns in all of HSSF, XSSF and SXSSF in under 3 seconds (ideally a lot less!), the problem is with your environment.
Далее говорится, что он выполнил XLS2CSV.java
, который я сделал. Подача в файл XSSF, сгенерированный выше (с 50000 строк и 50 столбцов), занимает около 15 секунд - столько же, сколько требуется для записи файла.
Что-то не так с моей окружающей средой, и если да, то как я буду исследовать дальше?
Статистика от VisualVM показывает, что куча использовала съемку до 1,2 ГБ во время обработки. Конечно, это слишком высоко, учитывая, что это дополнительный концерт на вершине кучи по сравнению с началом обработки?
Примечание: куча пространства исключение упоминалось выше, происходит только в производстве (на Google App Engine) и только для .xlsx
файлов, однако тесты, упомянутые в этом вопросе все были работать на моей машине развития с -Xmx2g
, Я надеюсь, что если я смогу исправить проблему в моей настройке разработки, она будет использовать меньше памяти при развертывании.
Стек след от приложения двигателя:
Caused by: java.lang.OutOfMemoryError: Java heap space at org.apache.xmlbeans.impl.store.Cur.createElementXobj(Cur.java:260) at org.apache.xmlbeans.impl.store.Cur$CurLoadContext.startElement(Cur.java:2997) at org.apache.xmlbeans.impl.store.Locale$SaxHandler.startElement(Locale.java:3211) at org.apache.xmlbeans.impl.piccolo.xml.Piccolo.reportStartTag(Piccolo.java:1082) at org.apache.xmlbeans.impl.piccolo.xml.PiccoloLexer.parseAttributesNS(PiccoloLexer.java:1802) at org.apache.xmlbeans.impl.piccolo.xml.PiccoloLexer.parseOpenTagNS(PiccoloLexer.java:1521)
Вы не одиноки: http://stackoverflow.com/questions/34246083/apache-poi-performance – raggi
Черт, я так много читал здесь, но не нашел этого! Большое спасибо. Кажется, это проблема с библиотекой, если тишина из списка рассылки - это что-то, что нужно сделать. Могу начать работу над обходным решением. – slugmandrew