web-dev-qa-db-fra.com

MemoryError lorsque je fusionne deux Pandas trames de données

J'ai cherché presque partout sur Internet et, d'une manière ou d'une autre, aucune des approches ne semble fonctionner dans mon cas.

J'ai deux gros fichiers CSV (chacun avec un million de lignes et environ 300-400 Mo de taille). Ils chargent finement dans des trames de données en utilisant la fonction read_csv sans avoir à utiliser le chunksize paramètre. J'ai même effectué certaines opérations mineures sur ces données, telles que la génération de nouvelles colonnes, le filtrage, etc.

Cependant, lorsque j'essaie de fusionner ces deux cadres, j'obtiens un MemoryError. J'ai même essayé d'utiliser SQLite pour effectuer la fusion, mais en vain. L'opération prend pour toujours.

Le mien est un PC Windows 7 avec 8 Go de RAM. La version Python est 2.7

Merci.

Edit: J'ai aussi essayé les méthodes de segmentation. Lorsque je fais cela, je n’obtiens pas MemoryError, mais l’utilisation de RAM) explose et mon système se bloque.

19
Ronit Chidara

Lorsque vous fusionnez des données à l’aide de pandas.merge, il utilise les mémoires df1, df2 et merge_df. Je crois que c'est pourquoi vous obtenez une erreur de mémoire. Vous devez exporter df2 dans un fichier csv, utiliser l’option chunksize et fusionner les données.

Ce pourrait être un meilleur moyen mais vous pouvez essayer ceci. * pour les grands ensembles de données, vous pouvez utiliser l'option chunksize dans pandas.read_csv

df1 = pd.read_csv("yourdata.csv")
df2 = pd.read_csv("yourdata2.csv")
df2_key = df2.Colname2

# creating a empty bucket to save result
df_result = pd.DataFrame(columns=(df1.columns.append(df2.columns)).unique())
df_result.to_csv("df3.csv",index_label=False)

# save data which only appear in df1 # sorry I was doing left join here. no need to run below two line.
# df_result = df1[df1.Colname1.isin(df2.Colname2)!=True]
# df_result.to_csv("df3.csv",index_label=False, mode="a")

# deleting df2 to save memory
del(df2)

def preprocess(x):
    df2=pd.merge(df1,x, left_on = "Colname1", right_on = "Colname2")
    df2.to_csv("df3.csv",mode="a",header=False,index=False)

reader = pd.read_csv("yourdata2.csv", chunksize=1000) # chunksize depends with you colsize

[preprocess(r) for r in reader]

cela enregistrera les données fusionnées en tant que df3.

17
T_cat