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

Reducer den brugte hukommelse ved at indlæse enorme panda-dataramme fra MongoDB

Hvad der er i en CSV og hvad der er i en dataramme er to meget forskellige ting. For eksempel 9.9 og 9.99999999999999 i en CSV vil tage den samme mængde plads i en dataramme.

Når det er sagt, fylder data i en dataramme meget mindre end data på en liste. At konstruere en liste er dyrt i hukommelsen; og tilføjelse til en dataramme kræver, at pandaer laver en ny (større) dataramme, kopierer alt og lader den originale dataramme blive opsamlet af affald.

Du ville sandsynligvis klare dig meget bedre, hvis du forudallokerede en dataramme på 60.000 rækker (eller hvor mange rækker du har i alt); f.eks.:

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

og derefter for hver række indsatte data for den pågældende række uden at stole på dataset liste:

data.values[count,:] = rowdata_at_count

Dette er ikke typesikkert, men det er ret hurtigt (da der ikke sker nogen tildelinger), så sørg for at rowdata_at_count er en liste, hvis elementer svarer til kolonnetyper.

REDIGER

Ja, at tilføje 100 linjer er, tror jeg, som 100 konkatter af en linje (da hvert tilføj skal omfordele og kopiere tabellen, ligesom concat). Forudallokering undgår både tilføjelse og konkat:tabelstørrelsen ændres ikke, ingen omallokering og kopiering skal udføres.



  1. Datoforespørgsel med ISODate i mongodb ser ikke ud til at virke

  2. Hvad er den mest tidseffektive måde at serialisere/deserialisere en datatabel til/fra Redis?

  3. db.collection er ikke en funktion ved brug af MongoClient v3.0

  4. Mongodb styrtede ned med Ugyldig adgang på adresse - segmenteringsfejlsignal 11 - version 2.6