2014-07-09 8 views
8

Jestem pod wrażeniem szybkości przeprowadzania transformacji, ładowania danych i łatwości użycia Pandas i chcę wykorzystać wszystkie te ładne właściwości (między innymi) do modelowania niektórych dużych zbiorów danych (~ 100-200k wierszy, < 20 kolumn). Celem jest praca z danymi w niektórych węzłach komputerowych, ale także zapewnienie widoku zestawów danych w przeglądarce za pośrednictwem Flask.Pandy jako szybkie przechowywanie danych dla aplikacji Flask

Obecnie korzystam z bazy danych Postgres do przechowywania danych, ale import (pochodzący z plików CSV) danych jest powolny, nużący i podatny na błędy, a pobieranie danych z bazy danych i przetwarzanie to niewiele łatwiej. Dane nigdy nie zostaną zmienione po zaimportowaniu (brak operacji CRUD), więc pomyślałem, że idealnie nadaje się do przechowywania go jako kilka pand DataFrame (przechowywanych w formacie hdf5 i ładowanych za pośrednictwem pytables).

Pytanie brzmi:

(1) Czy to dobry pomysł i jakie są rzeczy, na które trzeba uważać? (Na przykład nie oczekuję problemów z współbieżnością, ponieważ są one (powinny?) Być bezpaństwowcami i niezmiennymi (pod opieką od strony aplikacji)). O co jeszcze trzeba uważać?

(2) W jaki sposób uzyskać buforowanie danych po załadowaniu z pliku hdf5 do DataFrame, więc nie trzeba go ładować dla każdego żądania klienta (przynajmniej najnowsze/częste ramki danych). Flask (lub werkzeug) ma klasę SimpleCaching, ale wewnętrznie gromadzi dane i odrzuca zapisane w pamięci podręcznej dane dostępu. Zastanawiam się, czy jest to konieczne w moim konkretnym przypadku (zakładając, że obiekt z pamięci podręcznej jest niezmienny). Czy taka prosta metoda buforowania jest użyteczna, gdy system zostanie wdrożony z Gunicorn (czy możliwe jest posiadanie danych statycznych (pamięć podręczna) i czy współbieżne (różne procesy?) Żądają dostępu do tej samej pamięci podręcznej?).

Zdaję sobie sprawę, że jest to wiele pytań, ale zanim zainwestuję więcej czasu i zbuduję dowód na to, pomyślałem, że dostaję tu informacje zwrotne. Wszelkie przemyślenia są mile widziane.

+0

Interesujące pytanie. Zajmuję się również dużymi ilościami danych tylko do odczytu i często zastanawiam się nad chudym i pragmatycznym podejściem do tego. Czy mogę zapytać, z iloma płytami masz do czynienia? (Mam około 300 milionów = około 4 GB danych) – Hexatonic

+0

Jest w przedziale dziesiątek tysięcy (prawdopodobnie 100 000 na maksimum). Zgodziłem się z hdf5 i jestem bardzo zadowolony z tej decyzji i wykorzystania Pand (już od prawie 2 lat). Dobrą rzeczą w hdf5 i pytables jest to, że możesz uruchamiać zapytania na dysku bez ładowania całego pliku. Z moim małym zestawem danych jednak nigdy nie miałem takiej potrzeby (w twoim przypadku może być inaczej). Byłem szczególnie pod wrażeniem prędkości i/o odczytu pliku hdf5 w porównaniu z zapytaniem sql. – orange

Odpowiedz

3

odpowiedzi na niektóre aspekty co prosisz:

To nie jest całkiem jasne, z opisu czy masz tabele w bazie danych SQL tylko, przechowywane jako pliki hdf5 lub obu. Należy zwrócić uwagę, że jeśli używasz Python 2.x i tworzysz pliki za pośrednictwem pandy klasy HDFStore, wszystkie ciągi będą kiszone, co prowadzi do dość dużych plików. Możesz także wygenerować pandy DataFrame bezpośrednio z zapytań SQL, używając np. read_sql.

Jeśli nie potrzebujesz żadnych operacji relacyjnych, to powiedziałbym porzucić serwer postgre, jeśli jest już skonfigurowany i może ci się przydać, aby w przyszłości dalej używać serwera SQL. Zaletą serwera jest to, że nawet jeśli nie spodziewasz się problemów z współbieżnością, zostanie on automatycznie obsłużony przy użyciu (Flask-) SQLAlchemy, co powoduje mniejszy ból głowy. Ogólnie rzecz biorąc, jeśli kiedykolwiek spodziewasz się dodać więcej tabel (plików), mniejszy jest problem z centralnym serwerem baz danych niż przechowywaniem wielu plików.

Niezależnie od tego, w którą stronę się wybierasz, Flask-Cache będzie twoim przyjacielem, używając albo zaplecza memcached lub redis. Następnie można cache/memoize funkcji, która zwraca przygotowany DataFrame z pliku SQL lub HDF5. Co ważne, pozwala również na buforowanie szablonów, które mogą odgrywać rolę w wyświetlaniu dużych tabel.

Oczywiście można również wygenerować zmienną globalną, na przykład w przypadku tworzenia aplikacji Flask i po prostu zaimportować ją tam, gdzie jest ona potrzebna. Nie próbowałem tego, a zatem nie polecam go. Może to powodować różnego rodzaju problemy z współbieżnością.

+0

Dzięki Midnighter. To są świetne komentarze. Mam większość danych w bazie danych SQL, ale szukam sposobu na przeniesienie jej, ponieważ powoduje to zbyt duży ból głowy. Niektóre inne dane mogą być jednocześnie modyfikowane, więc nadal używam PostgreSQL. Zmienne globalne nie działały, gdy próbowałem Gunicorn. Wygląda na to, że każdy (asynchronicznie) pracownik Gunicorn ma swoją własną przestrzeń adresową, więc zarządzałby własną pamięcią podręczną (co nie jest zbyt przydatne). – orange

+0

@orange Do tej pory używałem tylko Apache do wdrożenia i tam musiałem przejść do modelu, w którym używam tylko jednego procesu, ale wiele wątków, ponieważ w przeciwnym razie żądania tego samego użytkownika zostały obsłużone przez różne procesy, które spowodowały problemy z sesją. Wciąż jednak muszę dojść do sedna. W takim przypadku globalny powinien działać dobrze. Zastanawiam się jednak, co powoduje problemy podczas pracy z SQL? Używając 'read_sql' możesz nawet napisać pełne zapytania i po prostu je przekazać. – Midnighter

+1

Przeprowadziłem wstępne testy i zauważyłem, że' read_sql' jest wolniejsze niż ładowanie pliku 'HDF5' z dysku. Ale większy problem polega na tym, że muszę zaimportować (tabele csv -> sql) masowe dane, które zajmują dużo czasu i są również dość niepraktyczne (muszę zdecydować, które kolumny użyć/importować w czasie importu. w formacie źródłowym (lub konwersji do 'HDF5') pozwala mi rozważyć kolumny później). – orange

Powiązane problemy