Подтвердить что ты не робот

Java.lang.OutOfMemoryError: Java куча пространства при чтении excel с Apache POI

Мой файл 9 МБ, и я получил эту ошибку при загрузке книги.

XSSFWorkbook workbook = new XSSFWorkbook(excelFilePath); 

эта строка вызывает java.lang.OutOfMemoryError: Java heap space

Как я могу это решить?

4b9b3361

Ответ 1

Я думаю, что размер кучи по умолчанию равен 128 М

Вы можете увеличить это с помощью аргумента -Xmx до java

например.

java -Xmx512m myapp.java

Ответ 2

Первое, что нужно проверить - открываете ли вы XSSFWorkbook с помощью InputStream или файла? Открытие его с помощью Файл имеет гораздо меньшую память.

Далее, вы хотите читать или писать? Если память очень плотная для вас, есть альтернативные варианты использования XSSF в саксофоне.

Подробнее о использовании XSSF + Sax см. в http://poi.apache.org/spreadsheet/how-to.html#xssf_sax_api. В качестве другого варианта, если вы просто хотите получить текстовое содержимое файла, то похоже, что Apache Tika имеет текстовый экстрактор на основе событий для файлов .xlsx с использованием POI.

Для написания в последнее время было много обсуждений в списке разработчиков POI об улучшении "Большой Grid Demo". Вы можете захотеть последовать за ними - http://poi.apache.org/mailinglists.html

Ответ 3

Как было предложено другими, первое, что нужно сделать, - увеличить размер кучи.

Если это не поможет или вы ожидаете больших файлов, вы также должны посмотреть на этот ответ: Обработка большого файла xlsx в Java

Он дает несколько хороших отправных точек на то, что можно сделать, если стандартный режим "читать все" не работает для вас.

Ответ 4

Я думаю, что 32-разрядная JVM имеет максимум 2 ГБ памяти. Однако это может быть устаревшим. Если я правильно понял, вы установили -Xmx на запуск запуска Eclipse. Если вы хотите увеличить объем памяти для программы, запускаемой из Eclipse, вы должны определить -Xmx в "Run- > Run configurations..." (выберите свой класс и откройте вкладку "Аргументы" в меню "Параметры VM" ), и НЕ при запуске Eclipse

Изменить: данные, которые вы просили. в Eclipse 3.4

1) Run- > Run Configurations...

2), если ваш класс не указан в списке слева в поддереве "Приложение Java", нажмите "Новая настройка запуска" в верхнем левом углу

2b) справа, вкладка "Главная" убедитесь, что проект и класс являются правильными.

3) выберите вкладку "Аргументы" справа. у этого есть две текстовые области. один для аргументов программы, которые входят в массив args [], предоставленный вашему основному методу. другой - для аргументов VM. положить в один с аргументами VM (ниже iirc) следующее: -Xmx2048m

Я думаю, что 1024m должно быть более чем достаточно для того, что вам нужно!

4) Нажмите "Применить", затем "Выполнить"

В случае, если все еще не хватает места для кучи, вы все равно можете изменить число до более высокого значения, например, вы можете поместить -Xmx4g, который добавляет от 2 гигабайт до 4 гигабайт

Ответ 5

Увеличить размер кучи как таковой:

-Xms256m -Xmx512m -XX: PermSize = 64M -XX: MaxPermSize = 1000M

Эти значения должны быть предоставлены виртуальной машине.

Взгляните на ссылку, это должно помочь вам

http://www.javabeat.net/tips/192-javalangoutofmemoryerror-java-heap-space.html

Ответ 6

При написании больших файлов:

Вам нужно SXSSF (Streaming API Usermodel).

SXSSF (пакет: org.apache.poi.xssf.streaming) - это совместимое с API потоковое расширение XSSF, которое должно использоваться, когда должны быть созданы очень большие электронные таблицы, а пустое пространство ограничено.

На этой странице также есть пример: вам нужно заменить XSSFWorkbook на SXSSFWorkbook.

Скопировал этот ответ из vadchen, из другого вопроса. Это сработало для меня. Мне просто нужно было заменить XSSFWorkbook на SXSSFWorkbook в коде, как он сказал.