2017-07-13 4 views
1

Je travaille sur un grand fichier CSV (~ 200 mb de fichier texte) que je voudrais convertir en feuille Excel, mais le classeur devient si consommateur de mémoire qu'au milieu du processus, Java jette "GC Overhead limite dépassé"! J'ai vérifié le code si je produis des références factices mais je pense qu'il n'en existe aucune. À mon avis, ces appels de bibliothèque de Apachi - POI peuvent générer des références qui maintiennent garbage collector si occupé. Ma question est de savoir si je pourrais simplement écrire le classeur dans un bloc de fichier par morceau comme un fichier texte quelque chose comme l'ajout à un fichier texte sans le mettre en mémoire. Y a-t-il une solution à cela ou est-ce que je manque quelque chose ici?Conversion de grandes données en Excel dans POI Apachi

GC jette l'exception dans le code suivant:

private void updateExcelWorkbook(String input, String fileName, Workbook workbook) { 
    try { 
     Sheet sheet = workbook.createSheet(fileName); 

     // Create a new font and alter it. 
     Font font = workbook.createFont(); 
     font.setFontHeightInPoints((short) 11); 
     font.setBold(true); 


     // Fonts are set into a style so create a new one to use. 
     CellStyle style = workbook.createCellStyle(); 
     style.setFont(font); 
     Row row; 
     Cell cell; 
     String[] columns; 
     String[] lines = input.split("\n"); 
     int colIndex; 
     int rowIndex = 1; 

     for (String line : lines) { 
      row = sheet.createRow(rowIndex++); 
      columns = line.split("\t"); 
      colIndex = 0; 

      for (String column: columns) { 
       cell = row.createCell(colIndex++); 
       if (rowIndex == 1) 
        cell.setCellStyle(style); 
       cell.setCellValue(column); 
      } 
     } 
    } catch (Exception ex) { 
     System.out.println(ex.getMessage()); 
    } 
} 

Répondre

3

Semble que vous utilisez le userModel POI, qui a une empreinte mémoire très élevée, car elle conserve la feuille entière en mémoire, similaire à la façon dont DOM conserve un document XML entier en mémoire.

Vous devez utiliser une API de diffusion en continu. En utilisant POI, vous pouvez créer .xlsx fichiers en utilisant l'SXSSF Buffered API Streaming, comme mentionné ici: https://poi.apache.org/spreadsheet/index.html#SXSSF+(Since+POI+3.8+beta3)

La page liée ci-dessus a cette image, montrant l'API de feuille de calcul Sommaire des caractéristiques des POI:
Spreadsheet API Feature Summary

+0

Mec, tu sauvé ma vie! Cela fonctionne comme un charme. Résultat beaucoup plus rapide sans problème mais le fichier Excel qui en résulte est un peu plus grand que celui créé par le classeur XSSF dont je me fiche! ;) –