Praca z big data w Pythonie i numpy, za mało pamięci ram, jak zapisać wyniki częściowe na dysku?
Próbuję zaimplementować algorytmy dla 1000-wymiarowych danych z 200k + datapoints w Pythonie. Chcę używać numpy, scipy, sklearn, networkx i innych użytecznych bibliotek. Chcę wykonywać operacje, takie jak parami odległość między wszystkimi punktami i zrobić klastrów na wszystkich punktach. Zaimplementowałem działające algorytmy, które wykonują to, co chcę, z rozsądną złożonością, ale gdy próbuję skalować je do wszystkich moich danych, kończy mi się pamięć ram. Oczywiście, że tak, tworząc matrycę dla odległości parowe na danych 200k + zajmują dużo pamięci.
Nadchodzi haczyk: naprawdę chciałbym to zrobić na gównianych komputerach z małą ilością pamięci ram.
Czy jest dla mnie wykonalny sposób, aby to działało bez ograniczeń niskiej pamięci ram. To, że zajmie to znacznie więcej czasu, naprawdę nie jest problemem, o ile reqs czasu nie idą w nieskończoność!
Chciałbym móc uruchomić moje algorytmy, a potem wrócić godzinę lub pięć później i nie mieć tego zablokowanego bo 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ść pary do wszystkich moich punktów itp
Czy to możliwe? I jak mam to zrobić, co mogę zacząć czytać?
Pozdrawiam // Mesmer
2 answers
Używając numpy.memmap
tworzysz tablice bezpośrednio odwzorowane w 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ć ją jako konwencjonalną tablicę: a + = 1000.
Możliwe jest nawet przypisanie większej liczby tablic do tego samego pliku, kontrolując je z wzajemnie źródeł, jeśli zajdzie taka potrzeba. Ale doświadczyłem tu pewnych trudnych rzeczy. Aby Otworzyć pełną tablicę musisz najpierw "zamknąć" poprzednią, używając del
:
del a
b = numpy.memmap('test.mymemmap', dtype='float32', mode='r+', shape=(200000,1000))
Ale otwarcie tylko pewnej części tablicy pozwala na osiągnięcie równoczesnego kontrola:
b = numpy.memmap('test.mymemmap', dtype='float32', mode='r+', shape=(2,1000))
b[1,5] = 123456.
print a[1,5]
#123456.0
Świetnie! a
została zmieniona razem z b
. A zmiany są już zapisane na dysku.
Kolejną ważną rzeczą wartą skomentowania jest offset
. Załóżmy, że chcesz wziąć Nie 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żesz uzyskać dostęp i zaktualizować dowolną część tablicy przy jednoczesnych operacjach. Zwróć uwagę na rozmiar bajtów w obliczeniach offsetowych. Więc dla' float64 ' ten przykład byłby 150000*1000*64/8.
Inne odniesienia:
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:01
Możesz po prostu zwiększyć pamięć wirtualną w systemie operacyjnym i użyć 64-bitowego Pythona, pod warunkiem, że jest to 64-bitowy system operacyjny.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-01 13:33:17