MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Riduci la memoria utilizzata per caricare enormi dataframe panda da MongoDB

Cosa c'è in un CSV e cosa c'è in un dataframe sono due cose molto diverse. Ad esempio, 9.9 e 9.99999999999999 in un CSV occuperà la stessa quantità di spazio in un dataframe.

Detto questo, i dati in un dataframe occupano molto meno spazio dei dati in un elenco. Costruire un elenco è costoso in memoria; e l'aggiunta a un dataframe richiede che i panda creino un nuovo dataframe (più grande), copi tutto, quindi lasci il dataframe originale da raccogliere.

Probabilmente faresti molto meglio se preallocassi un dataframe di 60000 righe (o quante righe hai in totale); es.:

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

e quindi per ogni riga inserita i dati per quella riga, senza fare affidamento su dataset elenco:

data.values[count,:] = rowdata_at_count

Questo non è sicuro dai tipi, ma è piuttosto veloce (poiché non si verificano allocazioni), quindi assicurati rowdata_at_count è un elenco i cui elementi corrispondono ai tipi di colonna.

MODIFICA

Sì, l'aggiunta di 100 righe è, credo, come 100 concat di una riga (poiché ogni append deve riallocare e copiare la tabella, proprio come concat). La preallocazione evita sia append che concat:la dimensione della tabella non cambia, non è necessario riallocare e copiare.