¿Cómo puedo mejorar el rendimiento de esta impresión doble?

Tengo el siguiente método estático que imprime los datos importados de una hoja de cálculo .xls de 40,000 líneas.

Ahora, lleva unos 27 segundos imprimir los datos en la consola y el consumo de memoria es enorme.

import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.*;

public static void printSheetData(List<List<HSSFCell>> sheetData) {
    for (int i = 0; i < sheetData.size(); i++) {
        List<HSSFCell> list = (List<HSSFCell>) sheetData.get(i);
        for (int j = 0; j < list.size(); j++) {
            HSSFCell cell = (HSSFCell) list.get(j);
            System.out.print(cell.toString());
            if (j < list.size() - 1) {
                System.out.print(", ");
            }
        }
        System.out.println("");
    }
}

Descargo de responsabilidad: lo sé, sé que los datos grandes pertenecen a una base de datos, no imprimen los resultados en la consola, la optimización prematura es la raíz de todos los males ...

Respuesta 1

En lugar de imprimir cada línea una a la vez, ¿ha intentado usar un StringBuilder para crear su cadena grande y luego imprimirla de una vez o después de agregar tantas líneas? Usaría StringBuilder como una especie de búfer.

p.ej,

public static void printSheetData(List<List<HSSFCell>> sheetData) {
    StringBuilder strBuilder = new StringBuilder();
    for (int i = 0; i < sheetData.size(); i++) {
        List<HSSFCell> list = (List<HSSFCell>) sheetData.get(i);
        for (int j = 0; j < list.size(); j++) {
            HSSFCell cell = (HSSFCell) list.get(j);
            // System.out.print(cell.toString());
            strBuilder.append(cell.toString());
            if (j < list.size() - 1) {
                // System.out.print(", ");
                strBuilder.append(", ");
            }
        }
        // System.out.println("");
        strBuilder.append("\n");

        // consider testing strBuilder size here and printing it out if
        // it is greater than some pre-set, then re-initializing the 
        // strBuilder variable.
    }
    System.out.println(strBuilder.toString());
}
Respuesta: 2

Estoy tratando de escribir un método llamado permutaciones. Básicamente, quiero que tome un número entero y luego devuelva todas las permutaciones de los números de 0 a x -1. Me doy cuenta de que esto debería devolver un ...

Tengo un TableView en una aplicación TornadoFX. Este TableView muestra una lista de pruebas y su estado (no iniciado, iniciado, aprobado, reprobado). Quiero que las filas de las pruebas aprobadas sean verdes, y las filas de ...

Cuando uso el código Selenium 2 (Java) para abrir Firefox (o cualquier otro navegador) para algunas pruebas automáticas, la nueva ventana se abre sin mis marcadores o, para el caso, la barra de marcadores. Además, yo ...

for (String header: headers) {for (int i = 0; i <dataList.get (0) .size (); i ++) {String s = dataList.get (0) .get (i); Cadena h = encabezado; ...