PDI de rendimiento

Estoy utilizando la PDI en mi aplicación web J2EE para generar un libro.
Sin embargo, me parece que el PDI toma alrededor de 3 minutos para crear un libro con 25K filas(con alrededor de 15 columnas cada uno).
Es este un PDI problema de rendimiento , o que es justificado a tomar mucho tiempo?
Hay otras Api conocido para un mejor rendimiento ?

  • respuestas aceptadas son un indicador para los que lean la pregunta de lo que el autor de la pregunta considera que la respuesta correcta a su problema real. Que es una pieza muy importante de información. Dicho esto, cualquier razón usted no comentó la necesidad de que el autor de la pregunta para proporcionar un mínimo fragmento de código que muestra el comportamiento descrito?
  • él es sólo una suposición. La razón real podría ser cualquier cosa, que el ejemplo de código mostraría inmediatamente. Sería razonable sugerir a mejorar su meta-la policía de proximidad?
  • Ravn Andersen: Sería razonable sugerir a mejorar su meta-meta-policía? 😉
  • Voy a considerar que cuando se ha alcanzado conmigo…
InformationsquelleAutor The Machine | 2010-03-23

5 Kommentare

  1. 12

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

    • PDI de registro puede ser activado, como se describe aquí
    • se ejecuta desde la memoria de intercambio o swap
    • su VM montón disponible puede ser muy baja
    • Va a haber internacional de los personajes de hacer el proceso más lento? Y otra pregunta, ¿cómo se puede aumentar la memoria de la máquina virtual de mejorar el rendimiento?
    • No creo internacional de los caracteres de hacer este tipo de procesamiento más lento: es sobre todo acerca de la cantidad de datos. Como para VM montón disponible, como la cantidad de memoria necesaria se compara a la disposición del montón, el recolector de basura tiene a tiro más a menudo: en casos extremos, la mayoría de la CPU tiempo se dedica a la recolección de basura. Esta es una situación específica: no es probable que usted está significativamente afectado por la misma.
    • en mi experiencia PDI es algo lento y si POI necesidades de un s*la carga de la memoria o de las necesidades de registro se apaga, entonces definitivamente **es un PDI problema. Generamos informes de uso de la PDI y tan pronto como se genera más de un par de hojas de cálculo se vuelve muy lento. También, 30000 filas x 10 células es realmente un trivialmente pequeña cantidad de datos de una CPU haciendo miles de millones de ciclos por segundo. Así que, sí, la PDI es bastante lento de la API.
    • Yo diría que la comparación de la persistencia de 30k filas contra el reloj de la CPU es un poco engañoso. Si se trabaja con grandes hojas de cálculo de forma eficiente era fácil de hacer, los dos emblemáticos de la oficina de suites de productividad no han requerido muchas ingeniero/años para romper el 64 límite de fila de la frontera.
  2. 14

    El rendimiento de escritura de archivos de gran tamaño con el POI puede ser muy reducido si se utiliza el ‘streaming’ POI API en lugar de la estándar. De hecho por defecto PDI va a mantener todos los datos en la memoria antes de escribir todo en 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 el streaming API puede controlar cómo se utiliza la memoria y los datos se escriben en el disco progresivamente.

    Con el fin de crear un flujo de libro, 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
      //...
    • Esto hizo una gran diferencia para mi caso de uso. Yo tenía una relativamente simple hoja con 45.000 filas y 20 columnas, sin fórmulas o fantasía formato. Se ejecuta en mi producción de VM, que originalmente tomó un poco menos de 2 minutos a generar. Después de cambiar a la transmisión de libro, es de 6 segundos. Wow.
  3. 3

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

  4. 1

    También hacemos uso de la PDI en nuestra aplicación web y no tienen ningún problema de rendimiento con él – a pesar de nuestros documentos generados son mucho más pequeñas que la suya. En primer lugar, comprobar si el PDI es el verdadero problema aquí. Se intenta generar los documentos sin J2EE-sobrecarga (Unidad de Prueba) y medir el rendimiento. También puede supervisar la carga y uso de memoria en el servidor J2EE para ver si los problemas vienen de algunos subóptima de la configuración del sistema.

  5. 1

    He comparado Apache POI con JExcel de la biblioteca. Parece que JExcel es hasta 4 veces más rápido que Apache POI, pero el consumo de memoria parece ser más o menos el 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 la versión 3.7. Usted necesita para descargar las últimas versiones de la biblioteca de ti y de ejecutar las pruebas simples de arriba para obtener más precisión de los números.

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

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

    • El límite de fila de Excel .xls formato de archivo limitación, no un PDI uno. Si utiliza el .xlsx formato de archivo (XSSF de Apache POI), entonces usted puede crear más filas

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea