MemoryError en grandes fusiones con pandas en Python

Estoy usando pandas para hacer una combinación outer en un conjunto de aproximadamente 1000-2000 archivos CSV. Cada archivo CSV tiene un identificador de columna de id que se comparte entre todos los archivos CSV, pero cada archivo tiene un conjunto único de columnas de 3-5 columnas. Hay aproximadamente 20,000 filas de id únicas en cada archivo. Todo lo que quiero hacer es combinarlos, unir todas las nuevas columnas y usar la columna id como el índice de combinación.

Lo hago usando una simple llamada de merge :

 merged_df = first_df # first csv file dataframe for next_filename in filenames: # load up the next df # ... merged_df = merged_df.merge(next_df, on=["id"], how="outer") 

El problema es que con casi 2000 archivos CSV, obtengo un MemoryError de MemoryError en la operación de merge lanzada por los pandas. ¿No estoy seguro de si esto es una limitación debido a un problema en la operación de combinación?

El dataframe final tendría 20,000 filas y aproximadamente (2000 x 3) = 6000 columnas. Esto es grande, pero no lo suficientemente grande como para consumir toda la memoria de la computadora que estoy usando, que tiene más de 20 GB de RAM. ¿Es este tamaño demasiado para la manipulación de los pandas? ¿Debería usar algo como sqlite en su lugar? ¿Hay algo que pueda cambiar en la operación de merge para que funcione en esta escala?

Gracias.

Creo que obtendrás un mejor rendimiento utilizando un concat (que actúa como una unión externa):

 dfs = (pd.read_csv(filename).set_index('id') for filename in filenames) merged_df = pd.concat(dfs, axis=1) 

Esto significa que solo está realizando una operación de combinación en lugar de una para cada archivo.

Me encontré con el mismo error en pyt de 32 bits al usar read_csv con un archivo de 1GB. Pruebe la versión de 64 bits y esperamos resolver el problema de error de memoria

pd.concat parece quedarse sin memoria para grandes marcos de datos, una opción es convertir los dfs a matrices y concentrarlos.

 def concat_df_by_np(df1,df2): """ accepts two dataframes, converts each to a matrix, concats them horizontally and uses the index of the first dataframe. This is not a concat by index but simply by position, therefore the index of both dataframes should be the same """ dfout = deepcopy(pd.DataFrame(np.concatenate( (df1.as_matrix(),df2.as_matrix()),axis=1), index = df1.index, columns = np.concatenate([df1.columns,df2.columns]))) if (df1.index!=df2.index).any(): #logging.warning('Indices in concat_df_by_np are not the same') print ('Indices in concat_df_by_np are not the same') return dfout 

Sin embargo, hay que tener cuidado ya que esta función no es una unión sino una aplicación horizontal mientras que los índices se ignoran.