Red de conocimiento informático - Problemas con los teléfonos móviles - Python resuelve el problema de que los programas de big data se ejecuten cada vez más lento.

Python resuelve el problema de que los programas de big data se ejecuten cada vez más lento.

Recientemente escribí un programa, lo ejecuté y procesé 150.000 datos. Inicialmente puedo procesar alrededor de 150 datos por segundo. Se estima que será procesado en unas 15 horas y comenzará a funcionar por la tarde. Pensé que recibiría los resultados al mediodía del día siguiente.

Pero cuando lo vi al día siguiente, ¿qué? Aún no ha terminado, la velocidad actual de procesamiento de datos se ha vuelto de aproximadamente 5 por segundo y luego tendremos que esperar 300 horas.

Luego busqué el problema. Resulta que muchas personas se han encontrado con este problema al tratar con big data. La mayoría de las razones analizadas en este artículo se deben a la degradación del rendimiento causada por GC (recolección de basura).

El mecanismo de recolección de basura de Python funciona manteniendo un recuento de referencias para cada objeto, y el recuento de referencias debe modificarse cada vez que se crea y destruye un objeto de memoria. Por lo tanto, al crear una gran cantidad de objetos, se requieren una gran cantidad de operaciones para modificar el recuento de referencias. La sobrecarga de rendimiento adicional durante la ejecución del programa es terrible. Hay dos posibilidades para activar el reciclaje. Una es que el usuario llama activamente a gc.collect () y la otra es que la cantidad de objetos excede el umbral.

Entonces es GC el que ralentiza el rendimiento del programa, por lo que podemos considerar deshabilitar la recolección de basura durante el procesamiento.

Después de estas mejoras, la precisión de la velocidad mejorará enormemente. Pero habrá otro problema, el desbordamiento de memoria, porque se genera una gran cantidad de objetos durante la operación y ya no se hace referencia a ellos después de un uso. Además, debido a que el mecanismo de recolección de basura está desactivado, la memoria existente no se ha limpiado. Y luego el uso de memoria del programa. La cantidad es cada vez mayor. La solución es activar gc.enable() periódicamente y luego desactivarlo o llamar activamente a gc.collect(), eso es todo.

Después de las mejoras anteriores, el programa ha mejorado mucho, pero mi programa todavía funciona cada vez más lento y dudo de mi vida. Luego probé cuánto tiempo tomó cada paso y descubrí por qué. Creé un marco de datos usando pandas y luego cada iteración da como resultado la adición de nuevos datos al marco de datos. A medida que se agregan más y más datos en el interior, la velocidad de adición se vuelve cada vez más lenta, lo que reduce seriamente la velocidad de ejecución. Aquí hay dos soluciones:

1 Guarde los resultados en segmentos, guarde los resultados a intervalos regulares y finalmente combine varios resultados.

2 Cambie el método de almacenamiento de datos. Utilizo directamente un diccionario de Python para guardar los resultados. A medida que aumentan los datos, se volverá más lento, pero la diferencia no es grande y se puede usar dentro de un rango aceptable. ; o utilice el método 1. Los segmentos también se pueden guardar y fusionar.