Erreur de mémoire avec de grands ensembles de données pour les pandas.concat et numpy.ajouter

Je suis confronté à un problème où je dois générer de grandes DataFrames dans une boucle (50 itérations de calcul à chaque fois deux 2000 x 800 pandas DataFrames). Je tiens à garder les résultats en mémoire dans un plus grand DataFrame, ou dans un dictionnaire de la forme de la structure.
Lors de l'utilisation de pandas.concat, j'obtiens une erreur de mémoire, à un certain point dans la boucle. Le même phénomène se produit lors de l'utilisation de numpy.ajouter à stocker les résultats dans un dictionnaire de numpy des tableaux plutôt que dans un DataFrame. Dans les deux cas, j'ai encore beaucoup de mémoire disponible (plusieurs GO). Est-ce trop de données pour des pandas ou des numpy? Sont-il plus efficace de la mémoire des moyens pour stocker mes données sans l'enregistrer sur le disque?

Comme un exemple, le script suivant échoue dès que nbIds est supérieure à 376:

import pandas as pd
import numpy as np
nbIds = 376
dataids = range(nbIds)
dataCollection1 = []
dataCollection2 = []
for bs in range(50):
    newData1 = pd.DataFrame( np.reshape(np.random.uniform(size = 
                                                          2000 * len(dataids)), 
                                        (2000,len(dataids ))))
    dataCollection1.append( newData1 )
    newData2 = pd.DataFrame( np.reshape(np.random.uniform(size = 
                                                          2000 * len(dataids)), 
                                        (2000,len(dataids ))))
    dataCollection2.append( newData2 )
dataCollection1 = pd.concat(dataCollection1).reset_index(drop = True)
dataCollection2 = pd.concat(dataCollection2).reset_index(drop = True)

Le code ci-dessous échoue lorsque nbIds est 665 ou plus

import pandas as pd
import numpy as np
nbIds = 665
dataids = range(nbIds)
dataCollection1 = dict( (i , np.array([])) for i in dataids )
dataCollection2 = dict( (i , np.array([])) for i in dataids )
for bs in range(50):
    newData1 = np.reshape(np.random.uniform(size = 2000 * len(dataids)), 
                         (2000,len(dataids )))
    newData1 = pd.DataFrame(newData1)
    newData2 = np.reshape(np.random.uniform(size = 2000 * len(dataids)), 
                         (2000,len(dataids)))
    newData2 = pd.DataFrame(newData2)
    for i in dataids :
        dataCollection1[i] = np.append(dataCollection1[i] , 
                                       np.array(newData1[i]))
        dataCollection2[i] = np.append(dataCollection2[i] , 
                                       np.array(newData2[i]))

J'ai besoin de calculer les deux DataFrames à chaque fois, et pour chaque élément i de dataids j'ai besoin d'obtenir une pandas Série ou un tableau numpy contenant 50 * 2000 numéros générés pour i. Idéalement, j'ai besoin d'être en mesure de l'exécuter avec nbIds égale à 800 ou plus.
Est-il un moyen simple de faire cela?

Je suis en utilisant 32 bits Python Python 2.7.5, les pandas 0.12.0 et numpy 1.7.1.

Merci beaucoup pour votre aide!

Pouvez-vous dire exactement combien de ram il utilise lorsqu'il échoue? Peut-être que c'est dû à la version 32 bits?
Avec la première méthode (à l'aide de pandas.concat) le processus utilise 638 MO quand il échoue. Avec la seconde méthode (stocker les données dans un dictionnaire, des tableaux numpy) le processus atteint d'une utilisation de la mémoire de 1.113 GO avant d'échouer.
Si votre environnement le permet, utilisez les pandas sur un 64 bits Python
Le code ci-dessus, en effet, semble fonctionner sur Python 64 bits. Cependant j'ai besoin pour le faire fonctionner pour Python 32 que j'en ai besoin pour être portable sur les systèmes 32 bit.

OriginalL'auteur Vidac | 2013-10-25