87 votes

Erreur de mémoire lors de l'utilisation de pandas read_csv

Je suis en train de faire quelque chose d'assez simple, la lecture d'un gros fichier csv dans une pandas dataframe.

C'est ce que je suis en utilisant pour ce faire:

data = pandas.read_csv(filepath, header = 0, sep = DELIMITER,skiprows = 2)

Le code se comporte assez erratique. Soit il échoue avec une erreur de mémoire (message d'erreur détaillé que P. S.), ou tout simplement ne se termine jamais (Mem utilisation dans le gestionnaire des tâches arrêté à 506 Mo et après 5 minutes sans aucun changement et aucune activité du PROCESSEUR dans le processus, j'ai arrêté).

Je suis à l'aide de pandas version 0.11.0. Je suis conscient qu'il y avait un problème de mémoire avec l'analyseur de fichier, mais selon http://wesmckinney.com/blog/?p=543 ce qui devrait avoir été corrigé. Le fichier que je suis en train de lire, 366 Mo, le code ci-dessus fonctionne, si je coupe le fichier vers quelque chose de court (25 Mo). Il est également arrivé que je reçois un message me disant qu'il ne peut pas écrire à l'adresse 0x1e0baf93...

Je suis en cours d'exécution le code de débogage dans Visual Studio, à l'aide de l'Anaconda et PTVS (l'étape-par-étape de débogage, F5).

Un peu de fond - je suis en train d'essayer de convaincre les gens que Python peut faire la même chose que R. Pour cela, je suis en train de reproduire un script R qui ne

data <- read.table(paste(INPUTDIR,config[i,]$TOEXTRACT,sep=""), HASHEADER, DELIMITER,skip=2,fill=TRUE)

R non seulement parvient à lire le fichier ci-dessus très bien, il lit même plusieurs de ces fichiers dans une boucle for (puis fait quelques trucs avec les données). Si Python n'ont un problème avec les fichiers de cette taille, j'ai peut-être un combat de perdre la bataille...

Toutes les idées sur ce qui va mal la bienvenue!

Merci, Anne

P. S. Voici les détails de la mémoire d'erreur dans le cas où il permet de:

Traceback (most recent call last):
  File "F:\QA ALM\Python\new WIM data\new WIM data\new_WIM_data.py", line 25, in
 <module>
    wimdata = pandas.read_csv(filepath, header = 0, sep = DELIMITER,skiprows = 2
)
  File "C:\Program Files\Python\Anaconda\lib\site-packages\pandas\io\parsers.py"
, line 401, in parser_f
    return _read(filepath_or_buffer, kwds)
  File "C:\Program Files\Python\Anaconda\lib\site-packages\pandas\io\parsers.py"
, line 216, in _read
    return parser.read()
  File "C:\Program Files\Python\Anaconda\lib\site-packages\pandas\io\parsers.py"
, line 643, in read
    df = DataFrame(col_dict, columns=columns, index=index)
  File "C:\Program Files\Python\Anaconda\lib\site-packages\pandas\core\frame.py"
, line 394, in __init__
    mgr = self._init_dict(data, index, columns, dtype=dtype)
  File "C:\Program Files\Python\Anaconda\lib\site-packages\pandas\core\frame.py"
, line 525, in _init_dict
    dtype=dtype)
  File "C:\Program Files\Python\Anaconda\lib\site-packages\pandas\core\frame.py"
, line 5338, in _arrays_to_mgr
    return create_block_manager_from_arrays(arrays, arr_names, axes)
  File "C:\Program Files\Python\Anaconda\lib\site-packages\pandas\core\internals
.py", line 1820, in create_block_manager_from_arrays
    blocks = form_blocks(arrays, names, axes)
  File "C:\Program Files\Python\Anaconda\lib\site-packages\pandas\core\internals
.py", line 1872, in form_blocks
    float_blocks = _multi_blockify(float_items, items)
  File "C:\Program Files\Python\Anaconda\lib\site-packages\pandas\core\internals
.py", line 1930, in _multi_blockify
    block_items, values = _stack_arrays(list(tup_block), ref_items, dtype)
  File "C:\Program Files\Python\Anaconda\lib\site-packages\pandas\core\internals
.py", line 1962, in _stack_arrays
    stacked = np.empty(shape, dtype=dtype)
MemoryError
Press any key to continue . . .

1voto

Oleksandr Points 11

Il n'y a pas d'erreur pour les Pandas 0.12.0 et NumPy 1.8.0.

J'ai réussi à créer un grand DataFrame et l'enregistrer dans un fichier csv et puis réussir à le lire. Veuillez voir l'exemple ici. La taille du fichier est de 554 Mo (Il a même travaillé pour 1,1 Go de fichiers, a pris plus de temps, pour générer 1,1 Go fichier d'utilisation de fréquences de 30 secondes). Si j'ai 4 go de RAM disponible.

Ma suggestion est d'essayer la mise à jour des Pandas. Autre chose qui pourrait être utile c'est d'essayer de l'exécution de votre script en ligne de commande, parce que, pour R vous n'êtes pas à l'aide de Visual Studio (cela a déjà été suggéré dans les commentaires à votre question), donc il a plus de ressources disponibles.

1voto

user27564 Points 43

J'ai rencontré ce problème aussi quand j'ai été exécute dans une machine virtuelle, ou quelque part d'autre où la mémoire est exclusivement limitée. Il n'a rien à voir avec des pandas ou des numpy ou csv, mais toujours se passera si vous essayez d'utiliser plus de mémoire que vous êtes admis à utiliser, même pas seulement en python.

La seule chance que vous avez est ce que vous avez déjà essayé, essayez de chomp vers le bas le gros truc en plus petits morceaux qui s'inscrivent dans la mémoire.

Si vous jamais demandé ce MapReduce est tout au sujet, vous avez trouvé par vous-même...MapReduce serait d'essayer de le distribuer les morceaux sur de nombreuses machines, vous essayez de traiter les chunke sur une machine, l'un après l'autre.

Ce que vous avez trouvé avec la concaténation de la partie des fichiers peut être un problème, en effet, peut-être il y a quelques copier nécessaires à cette opération...mais à la fin cela peut-être vous permet d'économiser dans votre situation actuelle, mais si votre fichier csv devient un peu plus grand, vous pouvez exécuter contre le mur une fois de plus...

Il pourrait aussi être, que les pandas est si intelligent, qu'en fait, il ne charge que les données individuelles des morceaux en mémoire si vous faites quelque chose avec elle, comme la concaténation d'un grand df?

Plusieurs choses que vous pouvez essayer:

  • Ne pas charger toutes les données à la fois, mais s'est divisé en en morceaux
  • Autant que je sache, hdf5 est capable de faire de ces morceaux automatiquement et ne charge que la partie de votre programme travaille actuellement sur
  • Regardez si les types sont ok, une chaîne '0.111111' a besoin de plus de mémoire qu'un float
  • De quoi avez-vous besoin en fait, si il y a l'adresse comme une chaîne de caractères, vous ne pourriez pas besoin de cela pour l'analyse numérique...
  • Une base de données peut aider acessing et de chargement que les pièces dont vous avez réellement besoin (par exemple, seulement 1% des utilisateurs actifs)

-1voto

John Doe Points 885

Bien que ce soit une solution de contournement qui ne soit pas vraiment une solution, j’essayerais de convertir ce fichier CSV en JSON (ce qui devrait être trivial) et d’utiliser plutôt la méthode read_json - j’ai écrit et lu des fichiers JSON / dataframes considérables ( Des centaines de Mo) dans les pandas de cette façon sans aucun problème.

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