MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Zmniejsz ilość pamięci używanej podczas ładowania ogromnych ramek danych pandy z MongoDB

To, co znajduje się w pliku CSV, a co w ramce danych, to dwie bardzo różne rzeczy. Na przykład 9.9 i 9.99999999999999 w pliku CSV zajmie taką samą ilość miejsca w ramce danych.

To powiedziawszy, dane w ramce danych zajmują znacznie mniej miejsca niż dane na liście. Konstruowanie listy jest kosztowne w pamięci; a dołączenie do ramki danych wymaga od pand utworzenia nowej (większej) ramki danych, skopiowania wszystkiego, a następnie pozostawienia oryginalnej ramki danych do wyczyszczenia.

Prawdopodobnie zrobiłbyś znacznie lepiej, gdybyś wstępnie przydzielił ramkę danych zawierającą 60000 wierszy (lub tyle, ile masz łącznie); np.:

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

a następnie dla każdego wiersza wstawiono dane dla tego wiersza, bez polegania na dataset lista:

data.values[count,:] = rowdata_at_count

Nie jest to bezpieczne dla typu, ale jest dość szybkie (ponieważ nie występują alokacje), więc upewnij się, że rowdata_at_count to lista, której elementy odpowiadają typom kolumn.

EDYTUJ

Tak, dołączenie 100 linii jest, jak sądzę, jak 100 concats jednej linii (ponieważ każdy append musi ponownie przydzielić i skopiować tabelę, tak jak concat). Wstępne przydzielanie pozwala uniknąć zarówno dołączania, jak i łączenia:rozmiar tabeli się nie zmienia, nie trzeba wykonywać ponownego przydzielania ani kopiowania.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. mongodb usuń wszystkie daty mniejsze niż określone

  2. Grupuj według wielu kolumn w MongoDB

  3. Uzyskaj liczbę poziomów logowania dla każdej nazwy

  4. Mongoose Promise z bluebirdem i maszynopisem

  5. MongoDB - Dlaczego powinienem używać kursora zamiast iterator_to_array (w PHP)