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

Author: Saullo G. P. Castro, 2013-04-22

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:

 40
Author: Saullo G. P. Castro,
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.

 -3
Author: xorsyst,
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