2014-10-26 15 views
6

plik zawiera 2000000 rzędach każdy rząd zawiera 208 kolumny oddzielone przecinku, na przykład:dlaczego numpy opray czyta z pliku zużywa tyle pamięci?

0.0863314058048,0.0208767447842,0.03358010485,0.0,1.0,0.0,0.314285714286,0.336293217457,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0

program odczytu tego pliku do numpy narray, to oczekuje się, że zużywają o (2000000 * 208 * 8B) = 3.2GB pamięci. Jednak, gdy program odczyta ten plik, stwierdziłem, że program zużywa około 20 GB pamięci.

Jestem zdezorientowany, dlaczego mój program zużywa tyle pamięci, że nie spełnia oczekiwań?

+0

Czy można wyświetlić dokładną linię kodu odczytującego dane z pliku? Trudno odpowiedzieć, jeśli musimy zgadywać. –

+0

@BasSwinckels dziękuję, używam np.loadtxt() do odczytu danych. Saullo Castro wskazał problem i objaśnił ten problem w przybliżeniu. –

Odpowiedz

2

używam Numpy 1.9.0 i inneficiency pamięci np.loadtxt() i np.genfromtxt() wydaje się być bezpośrednio związane z faktem, że są oparte na wykazy tymczasowe przechowywanie danych:

  • widzieć here dla np.loadtxt()
  • i here dla np.genfromtxt()

Znając wcześniej shape z twojej tablicy możesz myśleć o czytniku plików, który pochłonie ilość pamięci bardzo zbliżoną do teoretycznej ilości pamięci (3.2 GB dla tego przypadku), przechowując dane za pomocą odpowiednich dtype:

def read_large_txt(path, delimiter=None, dtype=None): 
    with open(path) as f: 
     nrows = sum(1 for line in f) 
     f.seek(0) 
     ncols = len(f.next().split(delimiter)) 
     out = np.empty((nrows, ncols), dtype=dtype) 
     f.seek(0) 
     for i, line in enumerate(f): 
      out[i] = line.split(delimiter) 
    return out 
+0

Po obejrzeniu przykładowego wiersza może nastąpić ogromne oszczędzanie pamięci, gdy zostanie użyta rzadka macierz, prawda? – user3666197

+0

@ user3666197 z pewnością tak, ale wymagałoby to bardziej złożonej funkcji czytnika ... –

+0

Z pewnością problem związany z OP wydaje się być związany z pamięcią, więc był to kierunek, w którym można było skutecznie wyeliminować problem związany z pamięcią związany z procesorem. wysiłki, które pozwalają zarówno na wejście jako takie, jak i na dalsze przetwarzanie, na większe zestawy danych (mój intuicja mówi, że OP nie szuka jednego lub kilku SLOC-ów, ale wykonalne podejście do wprowadzania i przetwarzania podobnych partii danych z numpy comfort, więc zapłacą koszt nieco inteligentniejszego wstępnego procesora wejściowego) – user3666197

0

Myślę, że powinieneś wypróbować pandas do obsługi dużych danych (pliki tekstowe). pandy to jak excel w pytonie. I wewnętrznie używają numpy do reprezentowania danych.

Pliki HDF5 to kolejna metoda zapisywania dużych danych w pliku binarnym hdf5.

to pytanie dać pewne wyobrażenie o tym, jak obsługiwać duże pliki - "Large data" work flows using pandas

+0

Nie korzystałem z pand, dziękuję za radę, nauczę się. –

Powiązane problemy