10
votes

MemoryError sur grande fusion avec des pandas en python

J'utilise des pandas pour faire un externe code> fusionner sur un ensemble d'environ ~ 1000-2000 fichiers CSV. Chaque fichier CSV a une colonne d'identifiant ID code> qui est partagée entre tous les fichiers CSV, mais chaque fichier a un ensemble unique de colonnes de 3-5 colonnes. Il y a environ 20 000 lignes code> ID code> dans chaque fichier. Tout ce que je veux faire, c'est de la fusionner ensemble, apportant toutes les nouvelles colonnes ensemble et à l'aide de la colonne ID code> comme indice de fusion.

Je le fais en utilisant un simple Fusionner code> Call: P>

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")


0 commentaires

3 Réponses :


8
votes

Je pense que vous aurez une meilleure performance en utilisant un concat (qui agit comme une jointure extérieure): xxx

cela signifie que vous ne faites qu'une seule opération de fusion plutôt que pour chaque fichier.


7 commentaires

À la mémoire de la mémoire, vous devriez pouvoir utiliser une expression générale au lieu de la compréhension de la liste ... (pas sûr du fonctionnement interne du concat si)


@ @root Eh bien, le générateur ne peut être que mieux que je pense (le pire cas qu'il convertit à une liste) :)


@root Bon spot BTW! (TBH je ne savais pas que Concat accepterait un générateur!)


Eh bien, je l'ai déjà vérifié avant de commenter: P; Il n'est pas mentionné dans les documents que je pense ...


@Andyhayden: Solution brillante, travaux, merci! Pourriez-vous expliquer pourquoi cela fonctionne mieux cependant? S'agit-il que chaque individu se fusionne de mémoire qui ne soit pas des ordures recueillies à temps, puis vous manquez de mémoire?


@ user248237dfsf Eh bien, la principale chose est que vous faites beaucoup plus d'opérations de fusion, et elle ne construit également que un dataframe (encore une fois c'est une opération coûteuse). Je me demande s'il y a un bug de fuite, je ne vois pas pourquoi il devrait manquer de mémoire ... (Je vois pourquoi ce serait beaucoup plus lent).


@ user248237dfsf Il peut être utile de poster cet aspect comme un >



0
votes

J'ai rencontré la même erreur en pytwhen 32 bits en utilisant read_csv avec fichier 1 Go. Essayez la version 64 bits et j'espère résoudre un problème d'erreur de mémoire


0 commentaires

0
votes

pd.concat semble être à court de mémoire pour les grands dataframes, une option consiste à convertir les DFS en matrices et concatez-les. xxx

Cependant, il faut faire attention car cette fonction n'est pas une jointure mais plutôt une annexe horizontale tandis que les indices sont ignorés


0 commentaires