XSSFCell вызывает блокировку при установке значения при работе с большими данными - PullRequest
0 голосов
/ 07 сентября 2018

Я записываю огромные данные в лист Excel. Я использую XSSFWorkbook для создания Excel.

Для 20000 строк отлично подходит запись Excel. Но когда я пытаюсь записать данные объемом более 1 миллиона, лист Excel выходит не более 3 часов. Когда я проанализировал jstack, я обнаружил, что существует блокировка, которая создается, пока

XSSFCell cell = row.createCell( colNum );
cell.setCellValue( value );

установка значения в ячейку,

Ниже приведены jstacks,

java.lang.Thread.State: RUNNABLE
        at org.apache.xmlbeans.impl.store.Saver$TextSaver.resize(Saver.java:1700)
        at org.apache.xmlbeans.impl.store.Saver$TextSaver.preEmit(Saver.java:1303)
        at org.apache.xmlbeans.impl.store.Saver$TextSaver.emit(Saver.java:1190)
        at org.apache.xmlbeans.impl.store.Saver$TextSaver.emitElement(Saver.java:962)
        at org.apache.xmlbeans.impl.store.Saver.processElement(Saver.java:476)
        at org.apache.xmlbeans.impl.store.Saver.process(Saver.java:307)
        at org.apache.xmlbeans.impl.store.Saver$TextSaver.saveToString(Saver.java:1864)
        at org.apache.xmlbeans.impl.store.Cursor._xmlText(Cursor.java:546)
        at org.apache.xmlbeans.impl.store.Cursor.xmlText(Cursor.java:2436)
        **- locked <0x000000076354cdc0> (a org.apache.xmlbeans.impl.store.Locale)**
        at org.apache.xmlbeans.impl.values.XmlObjectBase.xmlText(XmlObjectBase.java:1500)
        at org.apache.poi.xssf.model.SharedStringsTable.getKey(SharedStringsTable.java:134)
        at org.apache.poi.xssf.model.SharedStringsTable.addEntry(SharedStringsTable.java:180)
        at org.apache.poi.xssf.usermodel.XSSFCell.setCellValue(XSSFCell.java:350)
        at org.apache.poi.xssf.usermodel.XSSFCell.setCellValue(XSSFCell.java:320)

Как мы можем справиться с этим. Пожалуйста, помогите мне решить эту проблему.

1 Ответ

0 голосов
/ 04 октября 2018

SXSSFWorkbook может быть хорошим решением (комментарий выше) - если вы хотите использовать XSSFWorkbook, вы можете использовать XSSFFactory, который предоставляет SharedStringsTable, лучше подходящий для ваших потребностей (смотрите вашу трассировку стека, и именно SharedStringsTable вызывает блокировку)

Конструктор XSSFWorkbook , который принимает в качестве входных данных экземпляр XSSFFactory

Пример пользовательского XSSFFactory , который создает настраиваемую таблицу SharedStringsTable.Этот файл использует временный файл для данных общих строк, но вы можете изменить его, чтобы сохранить данные в HashMap.

...