es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Similitud de Python en conjuntos de cadenas a través de Pandas provoca un fallo de memoria. ¿Cómo puedo hacer que funcione?

Estoy teniendo dificultades para ejecutar mi código de Python, ya que siempre me quedo sin memoria. Así que tengo el siguiente marco de datos:
Tengo una columna con una clave y una columna con características. Este es un conjunto que contiene un máximo de 10 cadenas que no contienen espacios. Y en este ejemplo tengo alrededor de 70k filas.

Ahora lo que quiero hacer es comparar cada uno de los conjuntos de características con todos los demás conjuntos de características y obtener su similitud. El código para calcular la similitud es bastante sencillo, ya que solo quiero saber si hay 5 de las 10 cadenas en común, para darme una puntuación de similitud de 0.5, etc.

Este es el código actual, al final quiero tener una matriz para poder agruparlos fácilmente en base a un umbral de puntaje de similitud.

El problema es que esto agota toda mi memoria y utiliza más de 25 GB bastante temprano. Obviamente, también se debe a la gran cantidad de datos con 70K filas, pero habrá incluso posibilidades de usar incluso más filas, así que necesito encontrar una solución.

Ya he intentado con NumPy para solucionarlo un poco, pero no estoy llegando a ninguna parte.

¿Cómo podría hacer esto más eficiente? Necesito usar cadenas originalmente, obviamente podría cambiarlas a hashes o algo así, pero incluso así estoy un poco perdido.

Gracias de antemano,
Lukas

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Solución para optimizar el uso de memoria en Python

    Cuando se trabaja con conjuntos de datos grandes en Python, es común que el uso de memoria se convierta en un cuello de botella. En este caso, el problema radica en que la creación de la matriz de similitud requiere mucha memoria, debido al gran número de conjuntos de características que se están comparando.

    Aquí hay algunas soluciones potenciales para optimizar el uso de memoria en este escenario:

    1. Perfilado de memoria

    Antes de intentar cualquier optimización, es útil entender en qué se está utilizando la memoria. Un perfilador de memoria puede ayudar a identificar qué líneas de código están consumiendo más memoria. Python tiene varias herramientas de perfilado de memoria, como Pympler y memory_profiler, que se pueden utilizar para identificar el uso de memoria de objetos o funciones específicas.

    2. Cambiar tipos de datos

    Como se menciona en la pregunta, cambiar las cadenas de texto por hashes podría reducir potencialmente el uso de memoria, ya que los valores de hash ocupan menos espacio que las cadenas de texto originales. Sin embargo, esto solo sería efectivo si hay muchos conjuntos de características duplicados. Si cada conjunto de características es único, entonces el uso de hashes no reduciría el uso de memoria.

    Otra optimización potencial es convertir los tipos de datos enteros a tamaños más pequeños (por ejemplo, int32 en lugar de int64), o usar float16 en lugar de float32 o float64 si la precisión de los datos lo permite. Esto podría resultar en ahorros significativos de memoria para matrices grandes o marcos de datos.

    3. Uso de fragmentación o muestreo

    En lugar de comparar todos los conjuntos de características entre sí, podría ser posible realizar el cálculo de similitud en fragmentos o mediante el muestreo aleatorio de subconjuntos de datos. Este enfoque podría ser efectivo si la matriz de similitud no necesita ser exacta y un resultado aproximado es suficiente.

    4. Uso de matrices dispersas

    Dado que muchos de los conjuntos de características probablemente tienen pocos elementos en común, la mayoría de las entradas en la matriz de similitud serán cero. En este caso, podría ser más eficiente utilizar una representación de matriz dispersa para reducir el uso de memoria. Un formato común de matriz dispersa es el formato Compressed Sparse Row (CSR), que está implementado en la biblioteca SciPy. También se puede utilizar la clase pandas.SparseDataFrame para construir y manipular marcos de datos dispersos.

    5. Procesamiento paralelo

    Otra forma de acelerar el cálculo de similitud y reducir el uso de memoria es utilizar el procesamiento paralelo, que permite realizar múltiples cálculos simultáneamente en diferentes partes de los datos. Esto se puede implementar utilizando la biblioteca multiprocessing incorporada de Python o bibliotecas externas como Dask o Ray.

    6. Reducción del tamaño de los conjuntos de características

    Finalmente, podría ser posible reducir el tamaño de los conjuntos de características en sí, ya sea mediante el preprocesamiento de los datos para eliminar características menos informativas o mediante el uso de representaciones de características más compactas como bag-of-words o vectores TF-IDF. Esto podría hacer que el cálculo de similitud sea más eficiente y reducir el uso de memoria.

    En general, existen varias formas potenciales de optimizar el uso de memoria en Python cuando se trabaja con conjuntos de datos grandes. La solución más efectiva dependerá de las características específicas de los datos y el cálculo que se esté realizando. El perfilado de memoria y las pruebas de rendimiento pueden ayudar a identificar la estrategia de optimización más efectiva.

Comments are closed.