Używam zadania cron na mojej instancji Amazon EC2 micro co 12 godzin. Pobiera plik 118 MB i analizuje go za pomocą biblioteki json. To oczywiście sprawia, że instancja zabraknie pamięci. Moja instancja ma 416 MB wolnej pamięci, ale potem uruchamiam skrypt, który spada do 6 MB, a następnie zostaje zabity przez system operacyjny.Wydajny sposób analizowania 100MB ładunku JSON
Zastanawiam się, jakie są moje opcje? Czy można to wydajnie przetworzyć za pomocą Ruby, czy też muszę przejść do rzeczy niskiego poziomu, takich jak C? Mogę uzyskać bardziej zdolną instancję amazonek, ale naprawdę chcę wiedzieć, czy można to zrobić za pośrednictwem Ruby.
AKTUALIZACJA: Spojrzałem na yajl. Może dawać ci obiekty json podczas ich analizy, ale problem polega na tym, że jeśli twój plik JSON zawiera tylko 1 obiekt główny, to będzie musiał przetworzyć WSZYSTKIE pliki. Mój JSON wygląda następująco:
--Root
-Obj 1
-Obj 2
-Obj 3
Więc jeśli mam zrobić:
parser.parse(file) do |hash|
#do something here
end
Ponieważ mam tylko 1 główny obiekt będzie analizować całą JSON. Jeśli Obj 1/2/3 byłby rootem, to działałoby, ponieważ da mi je jeden po drugim, ale mój JSON nie jest taki, a parsuje 500 MB pamięci ...
AKTUALIZACJA # 2: Oto mniejsza wersja dużego pliku 118mb (7MB):
GONE
To parsowalnym, nie tylko trochę bajtów wyłączyć z akt sprawy, tak ci postrzegają ją jako cały. Tablica szukam jest to
events = json['resultsPage']['results']['event']
Dzięki
jest to możliwe, aby podzielić się pobieranie na 6 lub więcej segmentów, a następnie umieścić je z powrotem razem? –
100 MB tekstu JSON? Co przechowujesz? Biblioteka Aleksandrii? ': P' –
Dlaczego używasz JSON do tego? Nie brzmi jak odpowiedni format do pracy. Coś bardziej zorientowanego na rekord (nawet CSV) byłoby lepiej pasować. Jeśli nie możesz kontrolować formatu, to możesz ręcznie usunąć obiekt główny, aby wymusić format na JSON zorientowany na rekord. –