Pregunta

Estoy utilizando la PDI en mi aplicación web J2EE para generar un libro de trabajo. Sin embargo, me parece que PDI toma alrededor de 3 minutos para crear un libro con 25K filas (con alrededor de 15 columnas cada una). Es este un problema de rendimiento de puntos de interés, o se trata de justificarse a tomar mucho tiempo? ¿Hay otras API conocidos para un mejor rendimiento?

¿Fue útil?

Solución

Yo estaría muy sorprendido de ver PDI tomar mucho tiempo para generar un archivo de este tipo. I acaba de generar una hoja con 30000 filas x 10 células en aproximadamente 18 años (sin formato, para ser justos). La causa podría ser uno de los siguientes:

  • registro de puntos de interés podría ser activado, tal como se describe aquí
  • se ejecuta desde la memoria de intercambio
  • su VM de almacenamiento dinámico disponible podría ser muy baja

Otros consejos

El rendimiento de escritura de archivos de gran tamaño con el POI puede reducirse en gran medida si se ha utilizado la API de POI 'streaming' en lugar de la estándar. De hecho por PI predeterminado mantendrá todos sus datos en la memoria antes de escribir de una sola vez al final. La huella de la memoria de esto puede ser ridículamente grande para archivos de gran tamaño. En lugar de utilizar la API de streaming puede controlar cómo se utiliza la memoria y los datos se escriben en el disco de forma progresiva.

Con el fin de crear un libro de streaming, usar algo como:

  SXSSFWorkbook book = new SXSSFWorkbook(); 
  book.setCompressTempFiles(true);

  SXSSFSheet sheet = (SXSSFSheet) book.createSheet();
  sheet.setRandomAccessWindowSize(100);// keep 100 rows in memory, exceeding rows will be flushed to disk
  // ...

Si ninguna de las otras respuestas funciona, ver si JExcel de Andy Khan será mejor. He encontrado que sea muy superior a la PDI para tratar con Excel en Java.

También utilizar PDI en nuestra aplicación web y no tienen ningún problema de rendimiento con ella - a pesar de nuestros documentos generados son mucho más pequeña que la suya. Primero habría que hacer si el PDI es el verdadero problema aquí. Tratar de generar esos documentos sin la sobrecarga J2EE (Unidad-Test) y medir el rendimiento. También podría monitorear la carga y el uso de memoria en el servidor J2EE para ver si los problemas vienen de la configuración del sistema subóptimo.

He comparado Apache POI con la biblioteca JExcel. Parece que se trata de JExcel hasta 4 veces más rápido que Apache POI, pero el consumo de memoria parece ser más o menos lo mismo:

@Test
public void createJExcelWorkbook() throws Exception {
        WritableWorkbook workbook = Workbook.createWorkbook(new File("jexcel_workbook.xls"));
        WritableSheet sheet = workbook.createSheet("sheet", 0); 
        for ( int i=0; i < 65535; i++) {
            for ( int j=0; j < 10; j++) {
                Label label = new Label(j, i, "some text " + i + " " + j);
                sheet.addCell(label);
            }
        }
        workbook.write();
        workbook.close();
}

@Test
public void createPoiWorkbook() throws Exception {
    Workbook wb = new HSSFWorkbook();
    Sheet sheet = wb.createSheet("sheet");  
    for ( int i=0; i < 65535; i++) {
        Row row = sheet.createRow(i);
        for ( int j=0; j < 10; j++) {
            Cell cell = row.createCell(j);
             cell.setCellValue("some text " + i + " " + j);
        }
    }   
    FileOutputStream fileOut = new FileOutputStream("poi_workbook.xls");
    wb.write(fileOut);
    fileOut.close();
}

Lo he probado con JExcel versión 2.6.12 y Apache POI versión 3.7. Es necesario para descargar las últimas versiones de las bibliotecas mismo y ejecutar las pruebas simples de arriba para obtener los números más precisos.

<dependency org="org.apache.poi" name="poi" rev="3.7"/>
<dependency org="net.sourceforge.jexcelapi" name="jxl" rev="2.6.12"/>

Nota:. existe un límite en Apache POI de 65535 filas por hoja

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top