Quiero dar una respuesta más completa basada en la mayoría de las posibles soluciones que ya se proporcionan. También quiero señalar una ayuda potencial más que puede ayudar al proceso de lectura.
Opción 1: dtypes
"dtypes" es un parámetro bastante poderoso que puede usar para reducir la presión de memoria de los read
métodos. Mira esto y esto respuesta. Los pandas, por defecto, intentan inferir tipos de datos.
En referencia a las estructuras de datos, cada dato almacenado tiene lugar una asignación de memoria. En un nivel básico, consulte los valores a continuación (la tabla siguiente ilustra los valores para el lenguaje de programación C):
The maximum value of UNSIGNED CHAR = 255
The minimum value of SHORT INT = -32768
The maximum value of SHORT INT = 32767
The minimum value of INT = -2147483648
The maximum value of INT = 2147483647
The minimum value of CHAR = -128
The maximum value of CHAR = 127
The minimum value of LONG = -9223372036854775808
The maximum value of LONG = 9223372036854775807
Consulte esta página para ver la coincidencia entre los tipos NumPy y C.
Digamos que tiene una serie de enteros de dígitos . Puede asignar, teórica y prácticamente, una matriz de tipo entero de 16 bits, pero luego asignaría más memoria de la que realmente necesita para almacenar esa matriz. Para evitar esto, puede configurar la dtype
opción read_csv
. No desea almacenar los elementos de la matriz como un entero largo donde realmente puede ajustarlos con un entero de 8 bits (np.int8
onp.uint8
).
Observe el siguiente mapa dtype.
Fuente: https://pbpython.com/pandas_dtypes.html
Puede pasar el dtype
parámetro como un parámetro en los métodos pandas como dictar en read
{column: type}.
import numpy as np
import pandas as pd
df_dtype = {
"column_1": int,
"column_2": str,
"column_3": np.int16,
"column_4": np.uint8,
...
"column_n": np.float32
}
df = pd.read_csv('path/to/file', dtype=df_dtype)
Opción 2: Leer por fragmentos
La lectura de los datos en fragmentos le permite acceder a una parte de los datos en memoria, y puede aplicar el preprocesamiento en sus datos y preservar los datos procesados en lugar de los datos sin procesar. Sería mucho mejor si combina esta opción con la primera, dtypes .
Quiero señalar las secciones de libros de cocina de pandas para ese proceso, donde pueden encontrarlo aquí . Tenga en cuenta esas dos secciones allí;
Opción 3: Dask
Dask es un marco que se define en el sitio web de Dask como:
Dask proporciona paralelismo avanzado para análisis, permitiendo un rendimiento a escala para las herramientas que amas
Nació para cubrir las partes necesarias donde los pandas no pueden alcanzar. Dask es un marco poderoso que le permite mucho más acceso a los datos al procesarlos de manera distribuida.
Puede usar dask para preprocesar sus datos en conjunto, Dask se encarga de la parte de fragmentación, por lo que, a diferencia de los pandas, puede definir sus pasos de procesamiento y dejar que Dask haga el trabajo. Dask no aplica los cálculos antes de que sea explícitamente empujado por compute
y / o persist
(vea la respuesta aquí para ver la diferencia).
Otras ayudas (ideas)
- Flujo ETL diseñado para los datos. Mantener solo lo que se necesita de los datos sin procesar.
- Primero, aplique ETL a datos completos con marcos como Dask o PySpark, y exporte los datos procesados.
- Luego vea si los datos procesados pueden caber en la memoria como un todo.
- Considera aumentar tu RAM.
- Considere trabajar con esos datos en una plataforma en la nube.