Excel POI 3.5 WorkBook Исключение пространства кучи Java? - PullRequest
4 голосов
/ 29 января 2010

Я использую последний POI 3.5 для чтения в Excel. У меня установлен Excel MS Office 2007 и для этого ПО предоставляет XSSF для выполнения данных.

Для 15000 строк данных он выполняется правильно, но при превышении лимита до 30000, 100000 или 200000 он подвержен исключению пространства кучи Java.

Код ниже:

UATinput = new FileInputStream(UATFilePath);

uatBufferedInputStream = new BufferedInputStream(UATinput);

UATworkbook = new XSSFWorkbook(uatBufferedInputStream);

Я получаю Исключение в последней строке для размера кучи Java. Я увеличил размер, используя -Xms256m -Xmx1536m, но все же для большего количества данных он дает исключение пространства кучи Java.

Кто-нибудь может мне помочь с этим исключением для XSSFWorbook?

Ответы [ 9 ]

6 голосов
/ 29 января 2010

Вместо чтения всего файла в памяти попробуйте использовать eventusermodel api

Это очень эффективный способ чтения больших файлов. Он работает по принципу парсера SAX (в отличие от DOM) в том смысле, что он вызывает методы обратного вызова, когда встречаются определенные структуры данных. Это может быть немного сложнее, так как ожидает, что вы будете знать все основные данные

Здесь Вы можете найти хороший учебник по этой теме

Надеюсь, это поможет!

1 голос
/ 14 октября 2010

Это правда, ребята, после использования UserEventModel моя производительность была потрясающей. Пожалуйста, напишите мне, если у вас есть какие-либо проблемы. djeakandane@gmail.com

0 голосов
/ 30 сентября 2013

Вы можете использовать SXSSF, SXSSF API с низким объемом памяти, построенный поверх XSSF. «http://poi.apache.org/spreadsheet/how-to.html#sxssf"

0 голосов
/ 24 января 2013

JVM работает с фиксированной доступной памятью. Как только эта память будет превышена, вы получите «java.lang.OutOfMemoryError». JVM пытается сделать разумный выбор доступной памяти при запуске (см. Подробности в настройках Java), но вы можете перезаписать настройки по умолчанию следующими настройками.

Чтобы включить производительность, вы можете использовать определенные параметры в JVM. Xms1024m - установите минимальный доступный объем памяти для JVM на 1024 мегабайта Xmx1800m - установите максимально доступную память для JVM на 1800 мегабайт. Приложение Java не может использовать больше памяти кучи, чем определено с помощью этого параметра.

Если вы запускаете Java-программу из командной строки, используйте, например, следующий параметр: java -Xmx1024m YourProgram.

0 голосов
/ 14 сентября 2012

Вы действительно должны рассчитывать на обработку сетки данных XML, основанной на технологии XLSX. Вы освободитесь от кучи космических проблем. Вот учебник: Проверьте обе ссылки ниже.

http://poi.apache.org/spreadsheet/how-to.html

http://svn.apache.org/repos/asf/poi/trunk/src/examples/src/org/apache/poi/xssf/eventusermodel/examples/FromHowTo.java

Требуются некоторые базовые знания парсинга и использования проекта SAX-XML.

0 голосов
/ 16 июля 2011

Как уже говорили другие, лучше всего переключить Event API

Одна вещь, которая будет иметь небольшое значение, это не заключать файл в поток ввода! XSSF с радостью примет File в качестве входных данных, и это занимает меньше места в памяти, чем InputStream. Это связано с тем, что для POI необходим произвольный доступ к содержимому, а для входного потока единственный способ сделать это - сохранить все содержимое в памяти. С файлом, он может просто искать. Использование файла вместо InputStream сэкономит вам немного больше, чем размер файла.

Если вы можете, вы должны передать файл. Если памяти мало, запишите свой InputStream в файл и используйте его!

0 голосов
/ 08 февраля 2010

Другая вещь, которую нужно наблюдать в вашем собственном коде, - это количество объектов, которые вы «новые». Если вы создаете много объектов при чтении через ячейки, это также может исчерпать кучу. Убедитесь, что вы внимательно относитесь к числу создаваемых вами объектов.

0 голосов
/ 29 января 2010

Если вы используете XSSFWorkbook, POI должен создать модель памяти, содержащую весь ваш файл Excel, таким образом, огромное потребление памяти. Возможно, вы могли бы использовать Event API , который не так прост, как пользовательский API, но позволяет снизить потребление памяти.

Кстати, вы также можете установить большее значение для -Xmx ...

0 голосов
/ 29 января 2010

Попробуйте это: -Xms256m -Xmx512m.

...