2016-05-10 7 views
0

Я получаю эту ошибку «OutOfMemoryError: Java heap space» при сохранении файла с 1500 строк или более.Простые ODS, OutOfMemoryError: Java куча пространства при сохранении файла

Я пытаюсь решить этот раскол данные списка

Я пытался решить этот список данных разбиваются на более мелкие части и сохранить и загрузить файл ODS. Я использую функцию insertRowsBefore для добавления новых строк. Но это не работает для меня. Когда вы загружаете таблицу, добавляете новый список строк и сохраняете, функция сохранения сохраняет полную таблицу снова, и я получаю ошибку. Мои строки имеет тридцать пять столбцов

Я пытаюсь использовать эти версии:

<dependency> 
<groupId>org.odftoolkit</groupId> 
<artifactId>simple-odf</artifactId> 
<version>0.6.6</version> 
</dependency> 

и

<dependency> 
<groupId>org.apache.odftoolkit</groupId> 
<artifactId>simple-odf</artifactId> 
<version>0.7-incubating</version> 
</dependency> 

Сведения об ошибке:

13:45:12,821 INFO [stdout] Excepción: java.lang.OutOfMemoryError: Java heap space 
13:45:12,822 INFO [stdout] (asyncExecutor-1) at java.util.Arrays.copyOf(Arrays.java:2271) 
13:45:12,822 INFO [stdout] (asyncExecutor-1) at java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:113) 
13:45:12,822 INFO [stdout] (asyncExecutor-1) at java.io.ByteArrayOutputStream.ensureCapacity(ByteArrayOutputStream.java:93) 
13:45:12,822 INFO [stdout] (asyncExecutor-1) at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:140) 
13:45:12,823 INFO [stdout] (asyncExecutor-1) at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:221) 
13:45:12,823 INFO [stdout] (asyncExecutor-1) at sun.nio.cs.StreamEncoder.implWrite(StreamEncoder.java:282) 
13:45:12,823 INFO [stdout] (asyncExecutor-1) at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:125) 
13:45:12,823 INFO [stdout] (asyncExecutor-1) at java.io.OutputStreamWriter.write(OutputStreamWriter.java:207) 
13:45:12,823 INFO [stdout] (asyncExecutor-1) at java.io.Writer.write(Writer.java:127) 
13:45:12,824 INFO [stdout] (asyncExecutor-1) at org.apache.xml.serialize.Printer.printText(Unknown Source) 
13:45:12,824 INFO [stdout] (asyncExecutor-1) at org.apache.xml.serialize.XMLSerializer.printAttribute(Unknown Source) 
13:45:12,824 INFO [stdout] (asyncExecutor-1) at org.apache.xml.serialize.XMLSerializer.serializeElement(Unknown Source) 
13:45:12,824 INFO [stdout] (asyncExecutor-1) at org.apache.xml.serialize.BaseMarkupSerializer.serializeNode(Unknown Source) 
13:45:12,824 INFO [stdout] (asyncExecutor-1) at org.apache.xml.serialize.XMLSerializer.serializeElement(Unknown Source) 
13:45:12,824 INFO [stdout] (asyncExecutor-1) at org.apache.xml.serialize.BaseMarkupSerializer.serializeNode(Unknown Source) 
13:45:12,825 INFO [stdout] (asyncExecutor-1) at org.apache.xml.serialize.XMLSerializer.serializeElement(Unknown Source) 
13:45:12,825 INFO [stdout] (asyncExecutor-1) at org.apache.xml.serialize.BaseMarkupSerializer.serializeNode(Unknown Source) 
13:45:12,825 INFO [stdout] (asyncExecutor-1) at org.apache.xml.serialize.BaseMarkupSerializer.serializeNode(Unknown Source) 
13:45:12,825 INFO [stdout] (asyncExecutor-1) at org.apache.xml.serialize.BaseMarkupSerializer.serialize(Unknown Source) 
13:45:12,826 INFO [stdout] (asyncExecutor-1) at org.apache.xml.serialize.DOMSerializerImpl.write(Unknown Source) 
13:45:12,826 INFO [stdout] (asyncExecutor-1) at org.odftoolkit.odfdom.pkg.OdfPackage.flushDom(OdfPackage.java:1626) 
13:45:12,826 INFO [stdout] (asyncExecutor-1) at org.odftoolkit.odfdom.pkg.OdfPackage.getBytes(OdfPackage.java:1566) 
13:45:12,826 INFO [stdout] (asyncExecutor-1) at org.odftoolkit.odfdom.pkg.OdfPackage.save(OdfPackage.java:877) 
13:45:12,827 INFO [stdout] (asyncExecutor-1) at org.odftoolkit.odfdom.pkg.OdfPackage.save(OdfPackage.java:823) 
13:45:12,827 INFO [stdout] (asyncExecutor-1) at org.odftoolkit.simple.Document.save(Document.java:728) 
13:45:12,827 INFO [stdout] (asyncExecutor-1) at org.odftoolkit.odfdom.pkg.OdfPackageDocument.save(OdfPackageDocument.java:228) 

Вход для моих пользовательских функций и услуг

13:45:12,828 INFO [stdout] (asyncExecutor-1) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
13:45:12,828 INFO [stdout] (asyncExecutor-1) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
13:45:12,828 INFO [stdout] (asyncExecutor-1) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
13:45:12,828 INFO [stdout] (asyncExecutor-1) | java.lang.OutOfMemoryError: Java heap space 
13:45:12,828 INFO [stdout] (asyncExecutor-1) at java.util.Arrays.copyOf(Arrays.java:2271) 
13:45:12,828 INFO [stdout] (asyncExecutor-1) at java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:113) 
13:45:12,828 INFO [stdout] (asyncExecutor-1) at java.io.ByteArrayOutputStream.ensureCapacity(ByteArrayOutputStream.java:93) 
13:45:12,828 INFO [stdout] (asyncExecutor-1) at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:140) 
13:45:12,828 INFO [stdout] (asyncExecutor-1) at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:221) 
13:45:12,829 INFO [stdout] (asyncExecutor-1) at sun.nio.cs.StreamEncoder.implWrite(StreamEncoder.java:282) 
13:45:12,829 INFO [stdout] (asyncExecutor-1) at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:125) 
13:45:12,829 INFO [stdout] (asyncExecutor-1) at java.io.OutputStreamWriter.write(OutputStreamWriter.java:207) 
13:45:12,829 INFO [stdout] (asyncExecutor-1) at java.io.Writer.write(Writer.java:127) 

Мой экспорт код:

public static <T> void export(String[] columnTitle, List<T> data, String[] fields, String path, String filename) throws Exception { 

    try { 
     SpreadsheetDocument ods = SpreadsheetDocument.newSpreadsheetDocument(); 
     ods.removeSheet(0); 

     Table table = Table.newTable(ods, data.size() + MagicNumber.TWO, columnTitle.length, 0, 0); 
     table.setTableName(filename); 
     String[] values = new String[fields.length]; 
     int line = 0; 

     Border border = new Border(Color.BLACK, BORDER_WIDTH, StyleTypeDefinitions.SupportedLinearMeasure.PT); 

     List<Row> rows = table.getRowList(); 

     Row r = rows.get(line); 
     Cell cell = r.getCellByIndex(0); 

     //Style for column title 
     Font font = new Font(ARIAL_FONT, FontStyle.BOLD, MagicNumber.SEVEN, Color.BLACK); 
     r = rows.get(line); 
     for (int a = 0; a < fields.length; a++) { 
      cell = r.getCellByIndex(a); 
      cell.setStringValue(columnTitle[a]); 
      cell.setBorders(CellBordersType.ALL_FOUR, border); 
      cell.setCellBackgroundColor(Color.valueOf("#A5A5A5")); 
      cell.setFont(font); 
      cell.setHorizontalAlignment(HorizontalAlignmentType.CENTER); 
     } 

     //write data 
     font = new Font(ARIAL_FONT, FontStyle.REGULAR, MagicNumber.SEVEN); 
     for (T obj : data) { 
      line++; 
      r = rows.get(line); 
      for (int i = 0; i < fields.length; i++) { 
       cell = r.getCellByIndex(i); 
       values[i] = getProperty(obj, fields[i]); 
       cell.setStringValue(String.valueOf(values[i])); 
       cell.setBorders(CellBordersType.ALL_FOUR, border); 
       cell.setFont(font); 
       cell.setHorizontalAlignment(HorizontalAlignmentType.RIGHT); 
      } 
     } 

     //Error with 2000 results 
     ods.save(path); 

    } catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) { 
     LOG.error(e); 
    } catch (Exception e) { 
     LOG.error(e);    
    } 
} 
+0

Можете ли вы отправить образцы кода? Нам гораздо легче помочь с проблемой, если мы увидим ваш код. – slarge

+0

Редактировать с моим пользовательским кодом экспорта @slarge – oscar

+0

Что делает getProperty (obj, fields [i])? Что он получает? Я написал 20000 строк без проблем, это мой собственный пример класса на основе вашего. – slarge

ответ

0

Я должен был написать 200000 строк, прежде чем получить ошибку GC OutOfMemory.

Чтобы это исправить я добавил сохранить каждые 1000 строк (SAVE_POINT ниже) в течение цикла

for (T obj : data) { 
    line++; 
    r = rows.get(line); 

    for (int i = 0; i < fields.length; i++) { 
     cell = r.getCellByIndex(i); 
     values[i] = getProperty(obj, fields[i]); 
     cell.setStringValue(String.valueOf(values[i])); 
     cell.setBorders(CellBordersType.ALL_FOUR, border); 
     cell.setFont(font); 
     cell.setHorizontalAlignment(HorizontalAlignmentType.RIGHT); 
    } 

    if ((line % SAVE_POINT) == 0) { 
     ods.save(path + filename); 
    } 

} 

Я прочитал в нескольких форумах, которые говорят, простой ODF не очень хорошо с большими электронными таблицами так возможно, попробуйте другую библиотеку, такую ​​как POI, если у вас возникнут дополнительные проблемы.

+0

Я тоже это прочитал, но мне нужно создать файл ods. У вашего кода такая же проблема. Я пытался сохранить каждые 1000 строк. Я загружаю файл и использую insertRowsBefore для добавления новых строк. Но компонент simple-ods загружает существующий файл, добавляет новые строки и сохраняет все снова. Спасибо за вашу помощь. – oscar

+0

А вы правы. Я не получаю никаких ошибок в моем коде, даже если я пишу 300k. Возможно, вам придется писать, закрывать и снова открывать файл и записывать его партиями. – slarge

+0

Сколько столбцов в строке вы пишете? У меня 35 столбцов. Если я удалю строки форматирования ячейки, я могу написать 5000 строк без ошибок. Но все-таки большая разница. Ошибка не такая. Ваша ошибка GC OutOfMemory, а моя - пустое Java-пространство. – oscar

Смежные вопросы