OutOfMemory или GC Overhead с XSSF

В настоящее время мы используем XSSF для экспорта записей, хранящихся в БД, в Excel и загружаем их. Согласно нашему требованию, нам нужно разрешить пользователю загружать 3 миллиона записей.

С XSSF мы сталкиваемся с OutOfMemoryError: превышен лимит накладных расходов GC.

Я провел небольшое исследование и узнал, что XSSF требует памяти. Может ли кто-нибудь предложить мне лучший способ выполнить мое требование. Обратите внимание, что мне нужно загрузить данные в формате Excel, и я не хочу явно записывать их на какой-либо диск.


person Bharani    schedule 24.08.2016    source источник
comment
Возможный дубликат превышен лимит накладных расходов GC с Apache POI   -  person piet.t    schedule 24.08.2016


Ответы (1)


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

Вы также можете установить: SXSSFWorkbook.setCompressTempFiles, чтобы временные файлы XML не увеличивались до больших размеров на диске.

С помощью flushRows() вы можете вручную сбрасывать строки на диск.

Однако это медленнее. Но если память является ограничением, единственный вариант.

Имейте в виду, что некоторые методы неявно обращаются к строкам. Если эти строки уже были заменены на диск, вы столкнетесь с ошибками, и я считаю, что API предназначен только для записи больших файлов Excel.

public static void main(String[] args) throws Throwable {
        SXSSFWorkbook wb = new SXSSFWorkbook(); 
        wb.setCompressTempFiles(true);

        SXSSFSheet sh = (SXSSFSheet) wb.getSheetAt(0);
        sh.setRandomAccessWindowSize(100);// keep 100 rows in memory, exceeding rows will be flushed to disk, this is also the default
        for(int i=  1; i < 100000; i++){
          Row row = sh.createRow(i);  // do something with the row
        }
    }
person Melv_80    schedule 24.08.2016