2013-04-22 7 views
22

Próbuję wdrożyć algorytmy dla danych 1000-wymiarowych z 200k + datapoints w python. Chcę używać numpy, scipy, sklearn, networkx i innych przydatnych bibliotek. Chcę wykonywać operacje, takie jak odległość między wszystkimi punktami i grupowanie we wszystkich punktach. Zaimplementowałem działające algorytmy, które wykonują to, co chcę, z rozsądną złożonością, ale kiedy próbuję skalować je do wszystkich moich danych, zabraknie pamięci RAM. Oczywiście, że robię, tworzenie macierzy dla parowych odległości na 200k + danych zajmuje dużo pamięci.Praca z dużymi danymi w python i numpy, za mało pamięci RAM, jak zapisać częściowe wyniki na dysku?

Tutaj nadchodzi haczyk: Naprawdę chciałbym to zrobić na cholernych komputerach z małą ilością pamięci RAM.

Czy jest możliwy sposób, aby to zadziałało bez ograniczeń niskiego taranu. To zajmie znacznie więcej czasu, tak naprawdę nie jest to problemem, o ile czasy nie idą w nieskończoność!

Chciałbym móc ustawić moje algorytmy, a następnie wrócić godzinę lub pięć później i nie utknąć, ponieważ zabrakło pamięci RAM! Chciałbym zaimplementować to w pythonie i móc korzystać z bibliotek numpy, scipy, sklearn i networkx. Chciałbym móc obliczyć odległość między parami do wszystkich moich punktów.

Czy to możliwe? I jak mam się tym zająć, co mogę zacząć czytać dalej?

poważaniem // Mesmer

+0

Twoje pytanie jest dość ogólne i bardzo ogólne. Są to dość normalne rozmiary danych dla wielu zastosowań w przetwarzaniu sygnałów i uczeniu maszynowym. Proponuję dowiedzieć się o algorytmach i technikach stosowanych w tych dziedzinach. –

+3

Chcę być w stanie wykonać, na przykład, parami odległość między wszystkimi punktami w macierzy 200.000 x 1000 w Pythonie bez wystarczającej pamięci RAM, aby zachować całą matrycę odległości w pamięci. Szukam informacji na temat tego, jak to zrobić :) więc bardziej konkretne odpowiedzi byłyby niejasne "spójrz na dwa całe podkategorie informatyki" byłoby pomocne! – Ekgren

+6

Prawdopodobnie chcesz rzucić okiem na numpy [memmap] (http://docs.scipy.org/doc/numpy/reference/generated/numpy.memmap.html) i prawdopodobnie [PyTables] (http: // www. pytables.org) jako punkt wyjścia. –

Odpowiedz

31

Korzystanie numpy.memmap tworzenia tablic bezpośrednio mapowane do pliku:

import numpy 
a = numpy.memmap('test.mymemmap', dtype='float32', mode='w+', shape=(200000,1000)) 
# here you will see a 762MB file created in your working directory  

Można traktować go jako konwencjonalnej tablicy: + = 1000.

Możliwe jest nawet, aby przypisać więcej tablic do ten sam plik, kontrolując go ze źródeł wzajemnie w razie potrzeby. Ale mam tutaj kilka trudnych rzeczy. Aby otworzyć pełną gamę trzeba „zamknąć” poprzedni pierwszy, korzystając del:

del a  
b = numpy.memmap('test.mymemmap', dtype='float32', mode='r+', shape=(200000,1000)) 

Ale openning tylko jakaś część tablicy sprawia, że ​​możliwe do osiągnięcia na jednoczesne sterowanie:

b = numpy.memmap('test.mymemmap', dtype='float32', mode='r+', shape=(2,1000)) 
b[1,5] = 123456. 
print a[1,5] 
#123456.0 

Wspaniały! a został zmieniony razem z b. A zmiany są już zapisane na dysku.

Inną ważną rzeczą wartą komentowania jest offset. Załóżmy, że chcemy, aby nie podjąć pierwsze 2 linie w b, ale linie 150000 i 150001.

b = numpy.memmap('test.mymemmap', dtype='float32', mode='r+', shape=(2,1000), 
       offset=150000*1000*32/8) 
b[1,2] = 999999. 
print a[150001,2] 
#999999.0 

Teraz można uzyskać dostęp i zaktualizować dowolną część tablicy w jednoczesnych operacji. Zwróć uwagę na rozmiar bajtu w obliczeniach przesunięcia. Tak więc dla "float64" ten przykład będzie wynosił 150000 * 1000 * 64/8.

Inne odniesienia:

0

Można tylko ziemi do pamięci wirtualnej na OS i używać 64-bitowego pytona, zapewniając, że jest to 64-bitowy system operacyjny.

+0

Dlaczego mówisz "pod warunkiem, że jest to 64-bitowy system operacyjny"? Czy 32-bitowy python nie korzysta z pamięci wirtualnej? Pytam, ponieważ napotykam na błędy pamięci, które według mnie zostałyby wyleczone poprzez rozszerzenie pliku strony pamięci wirtualnej Windows7, ale pozostały takie same. – Lobotomik

+2

Procesy 32-bitowe są ograniczone do 2 GB pamięci RAM (wirtualnej lub innej). Dzieje się tak dlatego, że 32-bitowe pozwala tylko na adresowanie 4Gb, a system operacyjny rezerwuje 2 GB. Można to zmienić do 3Gb/1Gb, ale to twój limit. Jedynym innym sposobem jest podzielenie programu na oddzielne procesy za pomocą modułu wieloprocesowego, ograniczając każdy do 2 GB. – xorsyst

Powiązane problemy