2013-07-21 2 views
0

거대한 json 파일 (200MB)을 구문 분석하는 데 문제가 있습니다. 처음에는 jsonson을 사용하여 json을 트리로 구문 분석했습니다. 그러나, 나는 힙 크기 문제가 발생했습니다. 어떤 이유로 힙 크기를 늘리는 것은 선택 사항이 아닙니다.힙 크기를 늘리지 않고 거대한 json 파일을 구문 분석

JSON 형식 :

{ 
    "a1":{ "b1":{"c1":"somevalue", "c2":"somevalue"}, ... }, 
    "a2":{ "b1":{"c1":"somevalue"},"c3":"somevalue"}, ... }, 
    .... 
} 

내가 뭘 원하는 힙 문제없이이 작업을 수행 할 수있는 방법이 있나요

str1 = "{ "b1":{"c1":"somevalue", "c2":"somevalue"}, ... }" 
str2 = "{ "b1":{"c3":"somevalue"},"c4":"somevalue"}, ... }" 

같은 문자열을 생산하는 것입니다? 나는 단지 문자열을 원하기 때문에 잭슨 트리 접근 방법을 사용할 필요가 있습니다

파이썬에서

, 간단하게이 작업을 수행하는 방법도없고 힙 문제 (아무 JVM)

data = json.loads(xxx) 
for key,val in data.iteritems(): 
    puts val 

몇 가지 생각이있다. 스트리밍 잭슨 (Streaming Jackson)도 옵션이 될 수 있지만 json 형식이 매우 융통성이 있기 때문에 어려움을 씁니다. 모든 제안을 부탁드립니다! 빠르고 메모리를 적게 사용하여 객체 기반 데이터 바인딩 사용

감사

+1

그래서 JSON 스트리밍 API를 찾았지만 사용하는 데 어려움이 있습니다. 우리가 시도한 코드와 당신이 만나는 어려움에 대한 명확한 설명을 보지 않고 어떻게 도울 수 있습니까? –

+0

결과가 문자열 인 경우 즉시 문자열을 구문 분석하지 않는 것이 좋습니다. 'regex'가 당신이 요구하는 것과 일치 할 수 있습니까? – lichengwu

+0

@lichengwu 감사합니다! 너는 조언이 정말 도움이된다. 예, 사실 json을 파싱 할 필요가 없습니다. 나는 순수한 문자열 스트리밍 접근법을 사용해야한다 –

답변

0

당신이 구조와 일치하는 자바 클래스를 정의 할 수 있습니다, 그래서 만약 그게 더 나은 방법입니다, 좀 더 메모리 효율적입니다. 그러나 구조가 미리 알려지지 않은 경우 트리 모델이 필요합니다.

스트리밍 API가 도움이 될 수 있으며 JSON 토큰을 반복하여 사용한 다음 JsonParser.readValueAs(MyType.class) 또는 JsonParser.readValueAsTree()을 사용할 수도 있습니다. 이렇게하면 JSON 입력의 하위 세트에 대해서만 메모리 내 트리 또는 객체를 빌드 할 수 있습니다.

+0

고마워! 조언하는 것이 도움이됩니다. 내 생각은 다음과 같습니다. 우리의 데이터 형식은 매우 유연하고 체계적이지 않아서 스키마 나 클래스를 정의 할 수 없습니다. –

+0

스트리밍 방식을 사용하면 inputstream에서 jsonparser를 얻을 수 있으며 readValueAsTree는 json 문자열에 대한 전체 트리를 빌드하는 tree 메소드와 동일합니다. 전체 트리는 원래의 json보다 몇 배 더 많은 메모리를 소비합니다. –

+0

아니요,'JsonParser.readValueAsTree()'는 반드시 전체 스트림을 읽지는 않지만 토큰 파서로 시작하는 단일 값만 가리 킵니다 (또는 아무것도없는 경우 다음 토큰 그것은 가리킬 것이다). 스트림이 객체 또는 배열의 시퀀스로 구성되어 있으면 하나씩 읽을 수 있습니다. 따라서 'JsonParser'를 값의 첫 번째 토큰 (START_OBJECT 또는 START_ARRAY)으로 이동 한 다음 트리로 읽는 것만으로하면됩니다. – StaxMan

0

마지막으로 스트리밍 방식을 사용합니다. http에서 스트림을 열 때마다 버퍼에 고정 된 양의 바이트를 읽습니다. 내가 버퍼에 유효한 문자열을 만들었다 고 확인한 후에는 문자열을 내보내고 버퍼를 자릅니다. 이 방법으로 나는 아주 적은 메모리를 사용합니다. 감사!

+0

이 방법으로 전체 json을 위해 전체 트리를 만드는 것보다 적은 메모리를 사용하는 각각의 작은 json 문자열에 대한 트리 모델을 구축하고 있습니다. –

관련 문제