2017-10-23 32 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

?オブジェクトのメモリフットプリントが1Gに近い場合、これは別のシリアル化手法では解決できない可能性があります。 – f1sh

+0

オブジェクトにはいくつかのプロパティがあり、104219のレコードを持つarraylistがあり、各レコードには5つのプロパティがあります。 – Coded9

+0

@Ashok結果を単一の大きなjsonとしたいですか?私は最近、〜50GBのデータをjsonファイルに変換しましたが、データを複数のファイルに分割しました。各ファイルはわずか数MBでした。 – appl3r

答えて

1

ストリーミングアプローチを使用して、大きなJsonファイルをメモリに読み込まずに読み込むことができます。

さえGsonはストリーミングをサポートしています。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

ああ、本当に、ごめんなさい。しかし、Stream APIにはWriteモードもあります。既にGson Stream APIを使用してこれを実現しているのであれば、追加のコードを投稿していないので、あなたは答えとして何を聞きたいのか分かりません。 – appl3r