MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Réduisez la mémoire utilisée pour charger d'énormes données de pandas à partir de MongoDB

Ce qui est dans un CSV et ce qui est dans une base de données sont deux choses très différentes. Par exemple, 9.9 et 9.99999999999999 dans un CSV occupera la même quantité d'espace dans une trame de données.

Cela dit, les données d'un dataframe occupent beaucoup moins d'espace que les données d'une liste. Construire une liste coûte cher en mémoire; et l'ajout à une trame de données nécessite que pandas crée une nouvelle trame de données (plus grande), copie tout, puis laisse la trame de données d'origine être récupérée.

Vous feriez probablement beaucoup mieux si vous pré-allouiez une base de données de 60 000 lignes (ou le nombre de lignes que vous avez au total) ; par exemple :

data = pd.DataFrame(np.empty((60000,), dtype=[
    ('x', np.uint8),
    ('y', np.float64)
]))

puis pour chaque ligne insérée des données pour cette ligne, sans s'appuyer sur dataset liste :

data.values[count,:] = rowdata_at_count

Ce n'est pas de type sûr, mais c'est assez rapide (puisqu'aucune allocation ne se produit), alors assurez-vous que rowdata_at_count est une liste dont les éléments correspondent aux types de colonnes.

MODIFIER

Oui, ajouter 100 lignes est, je crois, comme 100 concats d'une ligne (car chaque ajout doit réallouer et copier la table, tout comme concat). La pré-allocation évite à la fois l'ajout et la concaté :la taille de la table ne change pas, aucune réallocation ni copie n'est nécessaire.