Al exportar millones de datos, ¿realmente explotó un OutOfMemoryError?

1. Planteando la pregunta

/**
 * 大数据导出1.0
 * /demo/exportExcel4
 * @param response
 */
@GetMapping("/exportExcel4")
public void exportExcel4(HttpServletResponse response) throws IOException {
    Date start = new Date();
    // 模拟数据
    List<UserExportVO> users = new ArrayList<>();
    for (int i = 0; i < 1000000; i++) {  //一百万数据量
        users.add(new UserExportVO("test-"+i,1,new         
     Date(),"18688888888","abc"+i+"@qq.com",null,"xxxx"));
    }
  ExcelUtil.exportExcelX(users, "测试导出表", "sheet1", UserExportVO.class, "测试导出表.xlsx", response);
 System.out.println("耗时:"+(new Date().getTime() - start.getTime())/1000+"秒");
}
 
 

Tiempo de exportación: 115 segundos, tamaño del archivo de exportación: 157M.

2. Exportación de big data

Exportar es posible, pero lleva demasiado tiempo, ¿hay alguna manera de reducirlo a la mitad? El tamaño del archivo de exportación es demasiado grande. ¿Hay alguna forma de reducirlo a la mitad?

La exportación de big data significa que cuando exportamos decenas de miles a millones de datos, cargar tantos datos de la base de datos en la memoria a la vez y luego escribirlos ejercerá presión sobre nuestra memoria y CPU . y escribir en Excel en secciones se manejan de la misma manera que la paginación para aliviar la presión sobre Excel.

La exportación de big data utiliza principalmente el método ExcelExportUtil.exportBigExcel:

 

/**
 * 大数据导出2.0
 * /demo/exportExcel5
 * @param response
 */
@GetMapping("/exportExcel5")
public void exportExcel5(HttpServletResponse response) throws IOException {
    Date start = new Date();
    Workbook workbook = null;
    ExportParams params = new ExportParams("大数据测试", "测试");workbook =         
    ExcelExportUtil.exportBigExcel(params, UserExportVO.class, new IExcelExportServer() {
        @Override
        public List<Object> selectListForExcelExport(Object obj, int page) {
            if (((int) obj) == page) {
                return null;
            }
            List<Object> list = new ArrayList<Object>();
            for (int i = 0; i < 10000; i++) {//1页查询1万,总共100页,100万数据.
                list.add(new UserExportVO("test-"+i,1,new 
            Date(),"18688888888","abc"+i+"@qq.com",null,"xxxxxx"));           
            }
            return list;
        }
    }, 100);
    ExcelUtil.downLoadExcel("大数据导出测试.xlsx",response,workbook);
    System.out.println("耗时:"+(new Date().getTime() - start.getTime())/1000+"秒");
}
 
 

La dificultad es la implementación de la interfaz IExcelExportServer, la capa inferior realizará page++ para buscar continuamente la siguiente página, por lo que debe haber una lógica para finalizar este ciclo. En proyectos reales, es más probable que el tamaño () de la lista consultada == 0.

La página comienza desde 1:

El tiempo de exportación es de unos 60 segundos, que es casi la mitad del tiempo en comparación con los 115 segundos de ahora.

 El tamaño del archivo exportado ha cambiado de los 157 M originales a 28 M, que es aproximadamente 6 veces menor.

Por supuesto, el primer método de exportación y el tamaño del archivo también están relacionados con la configuración de exportación, para resolver el problema de la exportación de imágenes se configuró en ExcelType.HSSF.

Si el formato está configurado en ExcelType.XSSF, OutOfMemoryError: se excedió el límite de sobrecarga del GC (esto sucede porque el programa básicamente agota toda la memoria disponible y el GC no puede limpiarla).

Resumir

Para la exportación de big data, lo principal a lo que hay que prestar atención es el desbordamiento de la memoria.

(1) Si se exporta 1 millón de datos utilizando ExcelType.XSSF, se informará un error: OutOfMemoryError: se excedió el límite de sobrecarga de GC.

(2) Se pueden exportar 1 millón de datos utilizando ExcelType.HSSF. Tarda unos 115 segundos y el tamaño del archivo exportado es de aproximadamente 157 M.

(3) El método de exportación de big data se puede exportar, lo que demora unos 60 segundos y el tamaño del archivo exportado es de aproximadamente 28 M.

Supongo que te gusta

Origin blog.csdn.net/WXF_Sir/article/details/130964625
Recomendado
Clasificación