java.lang.OutOfMemoryError:尝试将Java Object转换为Json String时的Java堆空间

时间:2013-11-24 13:05:58

标签: java gson

我尝试将csv文件转换为对象代表csv中的1行的对象的JSON文件200K。

我在32位和Project配置VM参数上安装了Java:-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 I build的模板:

{
    "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的单独文件,但这不是一个好方法。

我该如何解决这个问题?

谢谢,

4 个答案:

答案 0 :(得分:4)

我建议您使用streaming,而不是尝试将其全部复制到String

答案 1 :(得分:3)

您可以使用Gson streaming API 代替行走(流式传输)数据,而不是尝试一次性加载所有数据。

答案 2 :(得分:0)

有太多数据要立即读取所有数据并将其保存在内存中。你应该将它分解成更小的部分并逐步处理它。

答案 3 :(得分:0)

这是使用Gson Streaming API

将数据作为String流式传输到Json的方法
global.ProgressBar = require('electron-progressbar');