Widziałem wiele podobnych pytań do tego, ale nic, co naprawdę pasowało. Większość innych pytań zdawała się dotyczyć prędkości. Co mam przeżywa to pojedynczy słowniku json, który siedzi w pliku 1.1gig na moim lokalnym polu podejmowania wszystkich moich 16 gigabajtów pamięci, gdy próbuję załadować go za pomocą czegoś wzdłuż linii:Załaduj duży słownik w języku Python zakodowany jako Json bez użycia pamięci?
f = open(some_file, "rb")
new_dictionary = json.load(f)
Dzieje się tak niezależnie od tego, z jakiej biblioteki json korzystam (próbowałem ujson, json, yajl) i niezależnie od tego, czy czytam rzeczy w postaci strumienia bajtów, czy nie. To nie ma dla mnie żadnego sensu. Co to za zwariowane użycie pamięci i jak sobie z tym poradzić?
W przypadku, gdy jest to pomocne, słownik jest po prostu garstką zagnieżdżonych słowników, które mają ints wskazujący na inne int. Próbkę wygląda następująco:
{"0":{"3":82,"4":503,"15":456},"956":{"56":823,"678":50673,"35":1232}...}
UPDATE: Kiedy uruchomić to z simplejson, trwa właściwie tylko 8 koncertów. Nie mam pojęcia, dlaczego ten zajmuje mniej niż wszystkie inne.
AKTUALIZACJA 2: Zrobiłem więc więcej badań. Załadowałem słownik z simplejson i próbowałem konwertować wszystkie klucze na int (według sugestii Lioriego, że łańcuchy mogą zajmować więcej miejsca). Kosmos pozostał taki sam na 8 koncertach. Potem spróbowałem sugestii Winstona Ewerta o uruchomieniu gc.collect(). Przestrzeń pozostała na 8 koncertach. W końcu, zirytowany i ciekawy, wybrałem moją nową strukturę danych, wyszedłem z Pythona i ponownie załadowałem. Lo i oto, wciąż trwa 8 koncertów. Sądzę, że Python po prostu potrzebuje tyle miejsca na duży słownik 2d. Frustrujące, na pewno, ale przynajmniej teraz wiem, że to nie jest problem z JSON, o ile użyję simplejson do załadowania go.
Czy możesz powiedzieć nam więcej o tym, co znajduje się w obiekcie JSON? To znaczy. dużo list? słowniki? smyczki? pływa? Obiekty Pythona prawdopodobnie zajmą więcej pamięci niż wersja jednotarczowa, choć 16 razy więcej wydaje się podejrzaną. –
W obiekcie w języku Python jest dużo narzutów. Mogę się założyć, że tyle danych zajmuje tyle miejsca. – Gabe
Napisałem tę rzecz z Pythonem, i dobrze pasowało do pamięci, zanim ją napisałem. Zdecydowanie dzieje się coś dziwnego. – Eli