Chargement de fichier de taille conséquent avec pandas python

a marqué ce sujet comme résolu.
Auteur du sujet

Bonjour chers amis j’ai un problème avec mon application développé avec python3.4 et pandas. Au fait lorsque je veux charger un fichier qui fait 8 millions de ligne il n’arrive tandis que je peux charger un fichier de 10 millions sur rstudio pouvez vous me donner des idées me permettant de charger des fichiers de grande taille ?

Merci pour vos réponses.

À la recherche de la connaissance.

+0 -0

Il n’y arrive pas ? Quel est le problème ?

ache.one                 🦹         👾                                🦊

+0 -0
Auteur du sujet

Salut je le charge en utilisant le code suivant:

import pandas as ps
self.dataFrame = ps.read_table(self.nomFichier, sep=";", encoding="latin-1")

Merci

À la recherche de la connaissance.

+0 -0

Tu as essayé d’utiliser les options memory_map=True et engine='c' qui devraient diminuer l’empreinte mémoire de cette function ? Je me sers régulièrement de pandas pour charger des CSV de plusieurs millions de lignes, et en regardant le code je me sers de ces options.

I don’t mind that you think slowly, but I do mind that you are publishing faster. — W. Pauli

+0 -0
Auteur du sujet

j’ai essayer en ajoutant les options spécifiées j’obtiens toujours la même erreur

Traceback (most recent call last):
  File "C:\Python34\projet.py", line 968, in uploadFile
    self.dataFrame = ps.read_table(self.nomFichier, sep=";", memory_map=True, engine='c', encoding="latin-1")
  File "C:\Python34\lib\site-packages\pandas\io\parsers.py", line 705, in parser_f
    return _read(filepath_or_buffer, kwds)
  File "C:\Python34\lib\site-packages\pandas\io\parsers.py", line 451, in _read
    data = parser.read(nrows)
  File "C:\Python34\lib\site-packages\pandas\io\parsers.py", line 1065, in read
    ret = self._engine.read(nrows)
  File "C:\Python34\lib\site-packages\pandas\io\parsers.py", line 1828, in read
    data = self._reader.read(nrows)
  File "pandas\_libs\parsers.pyx", line 894, in pandas._libs.parsers.TextReader.read
  File "pandas\_libs\parsers.pyx", line 916, in pandas._libs.parsers.TextReader._read_low_memory
  File "pandas\_libs\parsers.pyx", line 993, in pandas._libs.parsers.TextReader._read_rows
  File "pandas\_libs\parsers.pyx", line 1122, in pandas._libs.parsers.TextReader._convert_column_data
  File "pandas\_libs\parsers.pyx", line 1167, in pandas._libs.parsers.TextReader._convert_tokens
  File "pandas\_libs\parsers.pyx", line 1215, in pandas._libs.parsers.TextReader._convert_with_dtype
  File "pandas\_libs\parsers.pyx", line 1905, in pandas._libs.parsers._try_int64
MemoryError

Merci vos réponses

À la recherche de la connaissance.

+0 -0

Quelle est la taille de ce fichier en octets, et quelle est la quantité de RAM disponible sur ta machine ?

Sous quel OS tournes-tu ? Si c’est autre chose que windows, que retourne la commande ulimit -a ?

Édité par nohar

I was a llama before it was cool

+0 -0
Auteur du sujet

Mon fichier fait 8000 Mo et j’ai une mémoire RAM de 8G, je suis sur windows8.1. Mon python est en 32bits et mon os est en 64 bits.

Merci pour vos différentes réponses.

À la recherche de la connaissance.

+0 -0

Arf, c’est limite. Tu devrais vraiment essayer Python 64bits. Mais si ton fichier fait déjà 8Go, ça va être dur de le faire tenir en RAM avec exactement 8Gio de RAM.

ache.one                 🦹         👾                                🦊

+0 -0

Ok, c’est ce que je craignais. La dataframe que tu essayes de générer a une taille proportionnelle à celle de ton fichier.

Concrètement : tu ne peux pas faire tenir toutes ces données dans la mémoire de ton ordinateur. Si tu veux faire des calculs dessus, il faut les faire à la volée en lisant le fichier itérativement. Je ne sais si pandas peut faire ça.

Édité par nohar

I was a llama before it was cool

+1 -0

C’est ce que fait pandas par défaut, en fait. Voir le paramètre low_memory de la doc.

Par contre, peut être que tu pourrais utiliser iterator pour obtenir un dataframe lui-même organisé en chunks.

I don’t mind that you think slowly, but I do mind that you are publishing faster. — W. Pauli

+0 -0
Auteur du sujet

je crois que je vais le traiter par blocs ça sera meilleur. Mon objectif est de pouvoir développer un logiciel capable de pouvoir traiter des données volumineuses sur des ordinateurs qui n’ont pas assez de mémoire RAM donc je cherche des techniques pour y parvenir.

Édité par melo96

À la recherche de la connaissance.

+0 -0

C’est la meilleure chose à faire. Si tu veux te familiariser avec cette facon de traiter les données, joue un peu avec la fonction reduce de Python (ou fold dans n’importe quel langage fonctionnel).

Ca t’habituera à penser avec un état que tu mets à jour en permanence pendant toute la durée de vie d’une boucle, et ça devrait pas mal t’armer pour ce genre de traitements.

I was a llama before it was cool

+0 -0
Auteur du sujet

OK merci nohar je vais essayer de procéder ainsi, donc si je comprends bien je prend un block de données je fais le traitement qu’il y a faire je le stock sur le disque dur , je procède ainsi jusqu’a ce que le fichier soit terminer.

À la recherche de la connaissance.

+0 -0

C’est pas tout à fait ça.

Imagine que tu veuilles avoir en memoire la moyenne d’une infinité de nombres.

Tu vas chercher à la calculer au fur et à mesure :

  • en comptant le nombre d’éléments qui passent n
  • en mettant à jour la variable moyenne = (moyenne * (n-1) + nombre) / n

Cela ne te demande que de stocker deux nombres en mémoire au lieu de 8 millions de nombres. Tu traites les données à la volée, une par une.

Édité par nohar

I was a llama before it was cool

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte