Wpis z mikrobloga

mam kilka zmieniających się codziennie plików json. są dość duże, między 20MB a 150MB.
muszę je przefiltrować raz dziennie na podstawie kilku różnych warunków (m.in. ==, !=, len, regex)
plik 1 filtruję, na podstawie jego wyników filtruję 2 (mając dostęp do pojedynczego wyniku z 1), potem na wynikach z 2 filtruje 3, itd.
real life example: szukam serwera, do niego dopasowuję maszynę na której stoi, do maszyny dopasowuję jej zasoby i zliczam zużycie. wszystko zlicza się na podstawie filtrów zdefiniowanych w yamlu.

na początku robiłem to operując na zserializowanym do dicta (używając python-benedict) jsonie, gdzie iteruję po każdym wyniku i szukam dla niego wyników. dopóki miałem kilka megabajtów danych to było to wystarczająco szybkie. teraz dotarła lista partycji, która aktualnie ma 143MB i cały mój kod się zesrał, trwa to co najmniej 30 minut (po tylu anulowałem).

myślałem o przeniesieniu tego do jakiejś bazy i filtrowaniu tam, ale mam do wyboru jedynie mysql 5.7 (gówniane korpo wymogi), gdzie jsonquery było ledwo co wprowadzone.
próbowałem yaql, ale po załadowaniu dużego pliku nie chce odpowiadać na zapytania waląc wyjątkiem o zbyt dużym pliku.
myślę jeszcze o memcached/redisie

jakieś inne pomysły?

  • 10
@srgs: widzę, że ktoś nawet napisał pythonowe bindingi do jq, więc spróbuję, dzięki.

@FantaZy: da się zrównoleglić, ale nadal skala tego będzie za duża. jeśli nie znajdę lepszego rozwiązania, to spróbuję tak, ale może czegoś nie znam. sprawdzę dataframesy.

@aloucie: muszę to pobrać z api, a potem nie mam żadnych większych ograniczeń.

@krasik01: nie mam dostępu do sqlserwera
@FantaZy: jak na razie pierwsze wygrywa, jq jest już na starcie tysiąc razy szybsze od poprzedniego rozwiązania - filtrowanie tego dużego pliku trwa poniżej sekundy ()

zostanie tylko przekonać twórcę filtrów, żeby ogarnął nową składnię...