Archivos grandes

Avatar de Usuario
Dalamar
Site Admin
Mensajes: 8926
Registrado: 09 May 2012 01:38

Archivos grandes

Mensajepor Dalamar » 07 Nov 2017 05:16

En este hilo quiero hablar sobre como lidiar con archivos grandes, que nos dan errores out-of-memory.

Pandas es la libreria numero uno para machine learning en python, pero no es una libreria buena para tratar con archivos grandes, normalmente utiliza 4 veces mas memoria del tamaño del archivo que quieres leer, por lo que debemos de optar por utilizar optimizaciones para consumir menos.

Otra opcion que cada vez va a estar mas de moda, es usar apache spark en vez de pandas y quiero aprovechar este hilo tambien para ir comentando como migrar el codigo, y como ir haciendo lo mismo que hacemos en pandas con park.

Por otro lado cuando vamos a entrenar un modelo con un monton de features debido a que hemos usado OneHotEncoding nos encontramos con gran cantidad de datos la mayoria son ceros y tenemos el riesgo de que ocupen demsiada memoria, por lo que tambien quiero explicar aqui como lidiar con estos casos, lo que normalmente se llama: Sparse Matrix.

Por supuesto, si podeis colaborar, estare agradecido y si alguien se anima a apuntarse a una competicion de Kaggle conmigo, genial, yo encantado!
¿Te ha gustado este hilo? Compartelo en las redes sociales para que se sume mas gente a la conversacion!

Avatar de Usuario
Dalamar
Site Admin
Mensajes: 8926
Registrado: 09 May 2012 01:38

Re: Archivos grandes

Mensajepor Dalamar » 07 Nov 2017 08:07

Voy a tomar como ejemplo: Corporación Favorita Grocery Sales Forecasting

Aqui el training file ocupa 4.5 Gigas, lo cual es suficiente para colgar un ordenador de 8G y probablemente uno de 16G.

Tambien he pasado por situaciones similares con los datasets de prediccion de retrasos en aerolineas.

Opciones:

    1. Al leer en pandas con pd.read_csv usar la opcion low_memory = True
    2. Esto puede no ser suficiente y aun asi colgarse al tratar de inferir los tipos de los campos, crear un diccionario con los tipos es muy util y ajustarlos en funcion de los rangos de las variables numericas, usando dtype=types_dict
    - Podemos especificar el numero de lineas a leer y desde ahi inferir el tipo de dato. (e.g nrows=20)

    Código: Seleccionar todo

       types_dict = {'id': 'int32',
                 'item_nbr': 'int32',
                 'store_nbr': 'int8',
                 'unit_sales': 'float32'}
       train = pd.read_csv('train.csv', low_memory = True , dtype=types_dict, usecols=[0,2,3,4], index_col = 'id')


    3. Tambien podemos limitarnos a leer unas columnas concretas y no todas, usando usecols=[0,2,3,4] como ejemplo para leer solo 4 columnas.

Analizar las columnas:

Código: Seleccionar todo

print(train.head())
print("----------------------")
print(train.max())
print("----------------------")
print(train.min())
print("----------------------")
print(train.shape)
¿Te ha gustado este hilo? Compartelo en las redes sociales para que se sume mas gente a la conversacion!

Avatar de Usuario
Dalamar
Site Admin
Mensajes: 8926
Registrado: 09 May 2012 01:38

Re: Archivos grandes

Mensajepor Dalamar » 12 Nov 2017 19:13

La mejor solucion que he encontrado para lidiar con archivos grandes en un ordenador limitado en RAM es usar Spark, veremos como user pySpark. (Recomiendo usar Spark desde Scala es mas eficiente, pero aqui voy a probar con Python, ya que hay que probarlo todo... :lol: )

Vamos a descargar la ultima version de Spark desde http://www-eu.apache.org/dist/spark/

En concreto la que no contiene Hadoop: spark-X.X.X-bin-without-hadoop.tgz

La descomprimimos en un path determinado que vamos a poner en la variable de entorno SPARK_HOME y en el path agregaremos %SPARK_HOME%\bin

Creamos la variable PYSPARK_DRIVER_PYTHON con valor "jupyter"

Y la variable PYSPARK_DRIVER_PYTHON_OPTS con valor "notebook"

Arrancamos Spark desde linea de comandos: pyspark --master local
¿Te ha gustado este hilo? Compartelo en las redes sociales para que se sume mas gente a la conversacion!

Avatar de Usuario
Dalamar
Site Admin
Mensajes: 8926
Registrado: 09 May 2012 01:38

Re: Archivos grandes

Mensajepor Dalamar » 15 Nov 2017 05:27

La gente en esta comopeticion en concreto esta teniendo problemas para hacer joins simples con ordenadores que tienen mucha memoria, con Spark se puede hacer sin problemas con poca memoria.

Ver: https://www.kaggle.com/c/favorita-grocery-sales-forecasting/discussion/43239#243599
Adjuntos
KaggleReply.JPG
¿Te ha gustado este hilo? Compartelo en las redes sociales para que se sume mas gente a la conversacion!

Avatar de Usuario
Dalamar
Site Admin
Mensajes: 8926
Registrado: 09 May 2012 01:38

Re: Archivos grandes

Mensajepor Dalamar » 25 Nov 2017 19:22

A ver que tal funciona esto:

Código: Seleccionar todo

  for col in list(df.select_dtypes(include=['int']).columns):
    if ((np.max(df[col]) <= 127) and(np.min(df[col]) >= -128)):
        df[col] = df[col].astype(np.int8)
    elif ((np.max(df[col]) <= 32767) and(np.min(df[col]) >= -32768)):
        df[col] = df[col].astype(np.int16)
    elif ((np.max(df[col]) <= 2147483647) and(np.min(df[col]) >= -2147483648)):
        df[col] = df[col].astype(np.int32)
for col in list(df.select_dtypes(include=['float']).columns):
    df[col] = df[col].astype(np.float32)
¿Te ha gustado este hilo? Compartelo en las redes sociales para que se sume mas gente a la conversacion!


Volver a “Competiciones de Kaggle”

Ingresar