3 votes

Fusion efficace de plusieurs fichiers csv volumineux

J'ai un script qui prend tous les fichiers csv d'un répertoire et les fusionne côte à côte, en utilisant une jointure externe. Le problème est que mon ordinateur s'étouffe (MemoryError) lorsque j'essaie de l'utiliser sur les fichiers que je dois joindre (environ deux douzaines de fichiers de 6 à 12 Go chacun). Je sais que itertools peut être utilisé pour rendre les boucles plus efficaces, mais je ne sais pas si et comment il pourrait être appliqué à cette situation. L'autre alternative à laquelle je pense est d'installer mySQL, d'en apprendre les bases et de faire cela à partir de là. Évidemment, je préférerais le faire en Python si possible, car je suis déjà en train de l'apprendre. Une solution basée sur R serait également acceptable.

Voici mon code :

import os
import glob
import pandas as pd
os.chdir("\\path\\containing\\files")

files = glob.glob("*.csv")
sdf = pd.read_csv(files[0], sep=',')

for filename in files[1:]:
    df = pd.read_csv(filename, sep=',')
    sdf = pd.merge(sdf, df, how='outer', on=['Factor1', 'Factor2'])

Tout conseil sur la manière de procéder avec des fichiers trop volumineux pour la mémoire de mon ordinateur serait grandement apprécié.

4voto

Kartik Points 3951

Utilisez HDF5 qui, à mon avis, répondrait très bien à vos besoins. Il gère également requêtes hors cœur pour que vous n'ayez pas à faire face MemoryError .

import os
import glob
import pandas as pd
os.chdir("\\path\\containing\\files")

files = glob.glob("*.csv")
hdf_path = 'my_concatenated_file.h5'

with pd.HDFStore(hdf_path, mode='w', complevel=5, complib='blosc') as store:
    # This compresses the final file by 5 using blosc. You can avoid that or
    # change it as per your needs.
    for filename in files:
        store.append('table_name', pd.read_csv(filename, sep=','), index=False)
    # Then create the indexes, if you need it
    store.create_table_index('table_name', columns=['Factor1', 'Factor2'], optlevel=9, kind='full')

0voto

Mike Graham Points 22480

Il y a une chance dask sera bien adapté à votre utilisation. Cela peut dépendre de ce que vous voulez faire après la fusion.

0voto

Kosch Points 434

Vous devriez pouvoir le faire avec python mais je ne pense pas que lire les csv en une fois soit l'utilisation la plus efficace de votre mémoire.

Comment lire un fichier CSV depuis un flux et traiter chaque ligne au fur et à mesure qu'elle est écrite ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X