java.lang.OutOfMemoryError: пространство кучи Java при чтении Excel с Apache POI - PullRequest
15 голосов
/ 20 мая 2011

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

XSSFWorkbook workbook = new XSSFWorkbook(excelFilePath); 

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

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

Ответы [ 6 ]

24 голосов
/ 20 мая 2011

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

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

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

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

8 голосов
/ 20 мая 2011

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

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

, например

java -Xmx512m myapp.java
3 голосов
/ 20 мая 2011

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

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

Это дает несколько хороших результатовуказывает на то, что можно сделать, если стандартный режим «читать все» у вас не работает.

2 голосов
/ 09 августа 2017

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

Вам необходимо SXSSF (API потоковой пользовательской модели).

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

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

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

2 голосов
/ 21 июня 2013

Я думаю, что 32-битная JVM имеет максимум 2 ГБ памяти. Хотя это может быть устаревшим.Если я правильно понял, вы устанавливаете -Xmx на панели запуска Eclipse.Если вы хотите увеличить память для программы, которую вы запускаете из Eclipse, вы должны определить -Xmx в меню «Выполнить-> Выполнить конфигурации ...» (выберите ваш класс и откройте вкладку «Аргументы», поместите его в область аргументов виртуальной машины)и НЕ при запуске Eclipse

Редактировать: детали, которые вы запрашивали.в Eclipse 3.4

1) Run-> Run Configurations ...

2) если ваш класс отсутствует в списке слева в поддереве «Java-приложения», нажмите «Новая конфигурация запуска "в верхнем левом углу

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

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

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

4) Нажмите Apply, затемНажмите «Выполнить»

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

1 голос
/ 20 мая 2011

Увеличьте размер кучи следующим образом:

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

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

Посмотрите на ссылку, это должно вам помочь

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

...