Chargement de fichier de taille conséquent avec pandas python

a marqué ce sujet comme résolu.

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.

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.

+0 -0

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

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 ?

+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.

+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.

+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.

+0 -0

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.

+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.

+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.

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

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