J'explore le passage à python et aux pandas en tant qu'utilisateur SAS de longue date.
Cependant, lors de l'exécution de certains tests aujourd'hui, j'ai été surpris que python soit à court de mémoire lors de la tentative d' pandas.read_csv()
un fichier csv de 128 Mo. Il contenait environ 200 000 lignes et 200 colonnes de données principalement numériques.
Avec SAS, je peux importer un fichier csv dans un ensemble de données SAS et il peut être aussi grand que mon disque dur.
Y a-t-il quelque chose d'analogue pandas
?
Je travaille régulièrement avec des fichiers volumineux et je n'ai pas accès à un réseau informatique distribué.
Réponses:
En principe, il ne devrait pas manquer de mémoire, mais il y a actuellement des problèmes de mémoire avec
read_csv
des fichiers volumineux causés par des problèmes internes complexes de Python (c'est vague mais on le sait depuis longtemps: http://github.com/pydata / pandas / issues / 407 ).Pour le moment, il n'y a pas de solution parfaite (en voici une fastidieuse: vous pouvez transcrire le fichier ligne par ligne dans un tableau NumPy pré-alloué ou un fichier mappé en mémoire--
np.mmap
), mais c'est celui que je vais travailler dans un proche avenir. Une autre solution est de lire le fichier en petits morceaux (utiliseriterator=True, chunksize=1000
) puis de concaténer ensuite avecpd.concat
. Le problème survient lorsque vous extrayez le fichier texte entier en mémoire en un seul gros slurp.la source
Wes a bien sûr raison! Je suis juste en train de sonner pour fournir un exemple de code un peu plus complet. J'ai eu le même problème avec un fichier de 129 Mo, qui a été résolu par:
la source
df = concate(tp, ignore_index=True)
?AssertionError: first argument must be a list-like of pandas objects, you passed an object of type "TextFileReader"
. Une idée de ce qui se passe ici?pd.concat(list(tp), ignore_index=True)
Il s'agit d'un thread plus ancien, mais je voulais juste vider ma solution de contournement ici. J'ai d'abord essayé le
chunksize
paramètre (même avec des valeurs assez petites comme 10000), mais cela n'a pas beaucoup aidé; avait encore des problèmes techniques avec la taille de la mémoire (mon CSV était ~ 7,5 Go).Pour le moment, je viens de lire des morceaux des fichiers CSV dans une approche en boucle for et de les ajouter, par exemple, à une base de données SQLite étape par étape:
la source
pandas.read_csv
renvoie directement (du moins sur la version que j'utilise actuellement) un itérateur si vous fournissez simplementiterator=True
etchunksize=chunksize
. Par conséquent, vous feriez simplement unefor
boucle sur l'pd.read_csv
appel, au lieu de le ré-instancier à chaque fois. Cependant, cela ne coûte que les frais généraux d'appel, il n'y a peut-être pas d'impact significatif.iterator=True
etchunksize
existaient déjà à l'époque si je me souviens bien. Peut-être qu'il y avait un bogue dans une version plus ancienne qui a provoqué une explosion de la mémoire - je vais essayer de nouveau la prochaine fois que je lis un grand DataFrame dans Pandas (j'utilise principalement Blaze maintenant pour de telles tâches)Voici mon flux de travail.
En fonction de la taille de votre fichier, vous feriez mieux d'optimiser la taille des morceaux.
Après avoir toutes les données dans la base de données, vous pouvez rechercher celles dont vous avez besoin à partir de la base de données.
la source
Si vous souhaitez charger d'énormes fichiers csv, dask peut être une bonne option. Il imite l'api de pandas, donc il se sent assez similaire aux pandas
lien vers dask sur github
la source
Vous pouvez utiliser Pytable plutôt que pandas df. Il est conçu pour les grands ensembles de données et le format de fichier est en hdf5. Le temps de traitement est donc relativement rapide.
la source