2014-11-14 3 views
0

Я написал код Java, который берет информацию из трех электронных таблиц и генерирует большую таблицу (10 столбцов, 26,950 строк) на машине с 4 ГБ памяти. Он рушился, поскольку он генерировал электронную таблицу (из памяти), но, переписывая код, чтобы читать большую электронную таблицу в кусках по 100 строк за раз, мне удалось добраться до точки, где она пишет выходной файл так как он удаляет ошибку из памяти.Как я могу освободить память, хранящуюся в XSSFWorkbook?

Поэтому я думаю, что если я смогу освободить память, хранящуюся в трех книгах XSSF, это может дать мне достаточно памяти для завершения записи выходного файла, но, похоже, не существует команды close() ,

Я пробовал устанавливать книги в нуль, но я не уверен, что освободил память.

Кто-нибудь знает «правильный» способ закрыть рабочую книгу XSSF и вернуть память, которую он занимает?

Я запускаю Java 1.8.0_25.

ответ

0

Попробуйте использовать SXSSFWorkbook вместо XSSFWorkbook. Он предназначен для сброса строк на диск вместо их хранения в памяти.

+0

Спасибо - Извинялся, что мне потребовалось столько времени, чтобы обойти его. – Simon

1

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

Вы можете

  • использование jvisualvm (включен в JDK), чтобы найти вашу утечку памяти,
  • попробовать Runtime.getRuntime().gc() для явного GC после освобождения все ссылки на лист,
  • взять посмотрите на streaming usermode API, чтобы сгенерировать новый файл, надеясь на меньшие требования к памяти.
Смежные вопросы