2017-10-23 36 views
0

큰 개체를 아래 코드를 사용하여 json 형식으로 문자열로 변환하려고하면 메모리 예외가 발생합니다 .1GB의 힙 크기를 사용하고 있습니다.GSON : Java 메모리 부족 오류 힙 공간

gson.toJson(this); 

우리는 어떻게 힙 크기를 증가시키지 않고이 오류를 제거하기 위해 GSON 스트리밍 API (https://sites.google.com/site/gson/streaming)를 사용할 수 있습니까?

Caused by: java.lang.OutOfMemoryError: Java heap space 
     at java.util.Arrays.copyOf(Arrays.java:2367) 
     at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:130) 
     at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:114) 
     at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:415) 
     at java.lang.StringBuffer.append(StringBuffer.java:237) 
     at java.io.StringWriter.write(StringWriter.java:112) 
     at com.google.gson.stream.JsonWriter.string(JsonWriter.java:576) 
     at com.google.gson.stream.JsonWriter.writeDeferredName(JsonWriter.java:402) 
     at com.google.gson.stream.JsonWriter.value(JsonWriter.java:417) 
     at com.google.gson.internal.bind.TypeAdapters$16.write(TypeAdapters.java:426) 
     at com.google.gson.internal.bind.TypeAdapters$16.write(TypeAdapters.java:410) 
     at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68) 
     at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.write(MapTypeAdapterFactory.java:208) 
     at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.write(MapTypeAdapterFactory.java:145) 
     at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68) 
     at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:97) 
     at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:61) 
     at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68) 
     at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:112) 
     at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:239) 
     at com.google.gson.Gson.toJson(Gson.java:661) 
     at com.google.gson.Gson.toJson(Gson.java:640) 
     at com.google.gson.Gson.toJson(Gson.java:595) 
     at com.google.gson.Gson.toJson(Gson.java:575) 
+0

어떻게 당신에 대해 개체 얘기입니다 비스

에도 GSON 스트리밍을 지원? 객체의 메모리 풋 프린트가 1G에 가까우면 다른 직렬화 방식으로는 해결할 수 없습니다. – f1sh

+0

개체에는 몇 가지 속성이 있고 arraylist에는 104219 개의 레코드가 있으며 각 레코드에는 5 개의 속성이 있습니다. – Coded9

+0

@Ashok 결과를 단일 큰 json으로 사용 하시겠습니까? 최근에 ~ 50GB의 데이터를 json 파일로 변환했지만 데이터를 여러 파일로 분할했습니다. 각 파일은 단지 몇 MB였습니다. – appl3r

답변

1

스트리밍 방식을 사용하여 모든 내용을 메모리에로드하지 않고 큰 Json 파일을 읽을 수 있습니다. 또한 https://google.github.io/gson/apidocs/com/google/gson/stream/JsonReader.html

: JAVA - Best approach to parse huge (extra large) JSON file

+0

사실 json 형식의 문자열로 작성하려고합니다. – Coded9

+0

오, 참, 죄송합니다. 그러나 스트림 API에도 쓰기 모드가 있습니다. 이미 Gson Stream API를 사용하여이를 수행하고있는 경우 추가 코드를 게시하지 않았기 때문에 답변을 듣고 싶습니다. – appl3r