Mam zestaw punktów danych, każdy opisany przez słownik. Przetwarzanie każdego punktu danych jest niezależne i przesyłam każdą z nich jako oddzielne zadanie do klastra. Każdy punkt danych ma unikalną nazwę, a moje opakowanie do przesyłania klastra po prostu wywołuje skrypt, który pobiera nazwę punktu danych i plik opisujący wszystkie punkty danych. Ten skrypt następnie uzyskuje dostęp do punktu danych z pliku i wykonuje obliczenia.Szybka serializacja JSON (i porównanie z pikle) do klastra w Pythonie?
Ponieważ każde zadanie musi załadować zestaw wszystkich punktów tylko w celu pobrania punktu do uruchomienia, chciałem zoptymalizować ten krok, serializując plik opisujący zestaw punktów w formacie łatwym do odzyskania.
Próbowałem za pomocą JSONpickle, stosując następujące metody serializacji słownika opisującą wszystkie punkty danych do pliku:
def json_serialize(obj, filename, use_jsonpickle=True):
f = open(filename, 'w')
if use_jsonpickle:
import jsonpickle
json_obj = jsonpickle.encode(obj)
f.write(json_obj)
else:
simplejson.dump(obj, f, indent=1)
f.close()
Słownik zawiera bardzo prostych obiektów (list, smyczki, pływaków, etc.) i ma w sumie 54 000 kluczy. Plik json ma rozmiar ~ 20 megabajtów.
Załadowanie tego pliku do pamięci zajmuje około 20 sekund, co wydaje mi się bardzo powolne. Przełączyłem się na używanie pikla z tym samym dokładnym obiektem i odkryłem, że generuje on plik o rozmiarze około 7,8 megabajtów i można go załadować w ciągu 1-2 sekund. Jest to znaczna poprawa, ale nadal wydaje się, że ładowanie małego obiektu (mniej niż 100 000 wpisów) powinno być szybsze. Poza tym pikle nie są czytelne dla ludzi, co było dla mnie dużą zaletą JSON.
Czy istnieje sposób użycia JSON do uzyskania podobnych lub lepszych przyspieszeń? Jeśli nie, czy masz inne pomysły na taką strukturę?
(Czy właściwym rozwiązaniem jest po prostu "podzielenie" pliku opisującego każde zdarzenie na osobny plik i przekazanie go do skryptu uruchamiającego punkt danych w zadaniu klastra? Wydaje się, że może to doprowadzić do rozprzestrzenienia się akta).
dzięki.
Dziękuję bardzo za twoją pouczającą odpowiedź, to było bardzo pomocne. Jakie bazy danych poleciłbyś w pythonie? Wolałbym rzeczy, które nie wymagają samodzielnych serwerów baz danych - lub jeszcze lepiej, które są wbudowane w Pythona, może jak sqlite - nad tymi, które robią. Jakieś przemyślenia na ten temat? Czy podejście bazodanowe w Pythonie będzie rywalizować z czasem pikle dla przypadku testowego w słowniku dla ~ 50 000 kluczy, z których trzeba wyciąć konkretny wpis? Jeśli przejdę do DB, napiszę niestandardowy kod, aby serializować do CSV, aby moje pliki mogły być udostępniane i czytane przez innych użytkowników. – user248237dfsf
Jeśli korzystasz z wbudowanego DB, to sqlite jest najlepszy, ale jak każdy inny wbudowany DB, nie kupuje on żadnego przetwarzania równoległego, w tym przypadku dużej mocy obliczeniowej podejścia DB. Jak trudne jest jednak uruchomienie procesu PostgreSQL? I TERAZ uzyskasz idealną równoległość dostępu do danych i duży wzrost wydajności. (Zapisywanie CSV lub innych formularzy do SQL DB i odrzucanie zawartości DB z powrotem do dowolnej postaci, jest prostą pracą z prostymi skrypty pomocnicze, oczywiście - to niezależne od wybranego silnika DB). –