2012-05-23 29 views
8

Mam plik JSON o wielkości 1.7 GB, gdy próbuję otworzyć z json.load(), to daje on błąd pamięci, Jak mógł odczytać plik json w pythonie?Otwieranie dużego pliku JSON w Pythonie

Mój plik JSON to duża tablica obiektów zawierających określone klucze.

EDYCJA: Cóż, jeśli jest to tylko jedna duża tablica obiektów i znana jest wcześniej struktura obiektów, to nie ma potrzeby używania narzędzi, które można odczytać wiersz po wierszu. Linia będzie zawierać tylko jeden element tablicy. Zauważyłem, że jest to sposób są przechowywane pliki json, dla mnie to działało jak tylko

>>>for line in open('file.json','r').readline(): 
... do something with(line) 
+1

Dlaczego masz tak duży plik JSON? Format, który jest właściwie zawsze wczytywany do pamięci jako całość, jest raczej nieodpowiedni dla dużych struktur takich jak ta. Rozważ przechowywanie danych w bazie danych. – ThiefMaster

+0

Co próbujesz zrobić z danymi? Skąd to pochodzi? –

+0

Prawdopodobnie powinienem przechowywać je w różnych plikach, ale nie robiłem tego :(, chcę użyć tych danych do analizy sentymentów. –

Odpowiedz

10

Chcesz przyrostową json parser jak yajl a jednym z jej powiązaniami Pythona. Inkrementalny analizator składni odczytuje tak mało jak to możliwe z danych wejściowych i wywołuje wywołanie zwrotne, gdy coś znaczącego zostanie zdekodowane. Na przykład, aby wyciągnąć tylko cyfry od dużego pliku json:

class ContentHandler(YajlContentHandler): 
    def yajl_number(self, ctx, val): 
     list_of_numbers.append(float(val)) 

parser = YajlParser(ContentHandler()) 
parser.parse(some_file) 

Zobacz http://pykler.github.com/yajl-py/ aby uzyskać więcej informacji.

+0

Mój plik json to jeden duży zestaw obiektów, które pomagają mi parsować? –

+1

@HirakSarkar: tak. Musisz zdefiniować odpowiednie wywołania zwrotne w klasie ContentHandler. – georg

+0

Mam problem z kablem po nawet instalacji yajl przez easy_install w powłoce Pythona daje błąd, że moduł yajl nie istnieje. Co powinienem zrobić. Moja wersja python to 2.6 –

1

Znalazłem kolejną owijkę Pythona wokół biblioteki yajl, która jest ijson.

To działa dla mnie lepiej niż yajl-py z powodu następujących powodów:

  • yajl-py nie wykrywa biblioteki yajl w moim systemie, miałem hack kod, aby to działało
  • Kod ijson jest bardziej zwarta i łatwiejsze w użyciu
  • ijson może pracować zarówno yajl v1 i v2 yajl, i to nawet ma czysty python wymiana yajl
  • ijson ma bardzo ładne ObjectBuilder, która pomaga wydobycia n ot tylko wydarzenia, ale znaczące podrzędne obiekty z analizowany strumienia, jak i na poziomie określić
0

znalazłem yajl (stąd ijson) się znacznie wolniej niż moduł json gdy duży plik danych był dostępny z lokalnego dysku. Tutaj jest modułem, który twierdzi, że lepiej niż yajl/ijson (jeszcze wolniej niż json), gdy używane z Cython:

http://pietrobattiston.it/jsaone

jako autor zaznacza, wydajność może być lepiej niż json gdy plik jest odbierane przez sieć, ponieważ inkrementalny analizator składni może rozpocząć przetwarzanie wcześniej.