2013-11-24 22 views
5

csvファイルをJSONファイルに変換しようとします。オブジェクトの200Kは、オブジェクトがcsvの1行を表します。java.lang.OutOfMemoryError:JavaオブジェクトをJson Stringに変換しようとすると、Javaのヒープスペース

私はJavaは32ビットとプロジェクトの設定VM引数にインストールされている:

-Xmx1024mしかし私が手:行で

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 
    at java.util.Arrays.copyOf(Unknown Source) 
    at java.lang.AbstractStringBuilder.expandCapacity(Unknown Source) 
    at java.lang.AbstractStringBuilder.ensureCapacityInternal(Unknown Source) 
    at java.lang.AbstractStringBuilder.append(Unknown Source) 
    at java.lang.StringBuffer.append(Unknown Source) 
    at java.io.StringWriter.write(Unknown Source) 
    at com.google.gson.stream.JsonWriter.string(JsonWriter.java:478) 
    at com.google.gson.stream.JsonWriter.value(JsonWriter.java:328) 
    at com.google.gson.Streams.write(Streams.java:113) 
    at com.google.gson.Streams.write(Streams.java:136) 
    at com.google.gson.Streams.write(Streams.java:136) 
    at com.google.gson.Streams.write(Streams.java:124) 
    at com.google.gson.Streams.write(Streams.java:136) 
    at com.google.gson.Gson.toJson(Gson.java:362) 
    at com.google.gson.Gson.toJson(Gson.java:346) 
    at com.google.gson.Gson.toJson(Gson.java:260) 
    at com.google.gson.Gson.toJson(Gson.java:240) 
    at ConvertFromCsv2JsonTWC.init(ConvertFromCsv2JsonTWC.java:186) 
    at ConvertFromCsv2JsonTWC.main(ConvertFromCsv2JsonTWC.java:48) 

:それは正常に動作します

Gson gson = new Gson(); 

String output = gson.toJson(container);// <---- crash 

50Kの行。

は、これは私が構築JSONのテンプレートです:

{ 
    "crs": { 
     "type": "none" 
    }, 
    "type": "FeatureCollection", 
    "features": [{ 
     "geometry": { 
      "type": "Point" 
     }, 
     "properties": { 
      "ap mac": "00:11:22:33:44:55", 
      "ssid": "WiFi", 
      "lat": "35.111111", 
      "long": "-118.11111", 
      "address": "370 xxxxxx", 
      "city": "xxxxxxx", 
      "state": "CA", 
      "zip code": "11111", 
      "country": "US", 
      "business n": "", 
      "location c": "Health Club/Gym", 
      "location q": "", 
      "indoor fla": "yes" 
     }, 
     "point": [35.390284, 
     -118.9929], 
     "id": 0, 
     "type": "Feature" 
    }, 
      {...}, 
      ... 
      200000... 

をだから私はpropertiesリストに

を200Kオブジェクトを持ってこの問題を回避するには、それぞれごとに別々のファイルの20Kを作成することですが、それは良くない道。

どうすればこの問題を解決できますか?

おかげで、

+3

代わりに[ストリーム](https://sites.google.com/site/gson/streaming)できますか?それは大量のデータです。 –

+0

@ElliottFrisch私が受け入れられるようにこのコメントを回答として投稿してください。ありがとうございました – snaggs

答えて

4

Stringにすべてコピーするのではなく、streamingを使用することをおすすめします。

+0

コメントの1番目として受け入れました。ありがとう – snaggs

+0

異なるプロパティを持つオブジェクトのみがあり、1000万レコードのリストがある場合は、どうすればストリームできますか? – Coded9

0

一度にそれのすべてを読み、メモリにそれを維持するためにあまりにも多くのデータがあります。小さな部分に分割し、それを断片的に処理する必要があります。

3

Gson streaming APIを使用すると、データを一度に読み込むのではなく、そのデータをウォーク(ストリーム)することができます。

関連する問題