编写Big JSON文件以避免OutOfMemory问题的最佳方法

时间:2014-02-04 13:00:40

标签: java json amazon-s3 out-of-memory gson

首先,请注意今天是GSON的第一天。我正在尝试使用GSON库编写Json文件。我在JsonObjects内有数千ArrayList[ { "hash_index": "00102x05h06l0aj0dw", "body": "Who's signing up for Obamacare?", "_type": "ArticleItem", "title": "Who's signing up for Obamacare? - Jan. 13, 2014", "source": "money.cnn.com", "primary_key": 0, "last_crawl_date": "2014-01-14", "url": "http://money.cnn.com/2014/01/13/news/economy/obamacare-enrollment/index.html" }, { "hash_index": "00102x05h06l0aj0dw0iz0kn0l@0t#0", "body": "Who's signing up for Obamacare?", "_type": "ArticleItem", "title": "Who's signing up for Obamacare? - Jan. 13, 2014", "source": "money.cnn.com", "primary_key": 1, "last_crawl_date": "2014-01-14", "url": "http://money.cnn.com/2014/01/13/news/economy/obamacare-enrollment/index.html" } ] 。写入Json文件时,它看起来应该与此类似。

 private void writeNewJsonFile() throws IOException
    {
        System.out.println("Starting to write the JSON File");
        //Add everything into a JSONArray
        JsonArray jsonArrayNew = new JsonArray();

        for(int i=0;i<jsonObjectHolder.size();i++)
        {
            System.out.println("inside array");
            jsonArrayNew.add(jsonObjectHolder.get(i));
        }


        //Write it to the File
    /*  File file= new File("items_Articles_4_1.json");

        FileWriter fw = new FileWriter(file);;
        fw.write(jsonArrayNew.toString());
        fw.flush();
        fw.close();*/

        System.out.println("outside array");

        ByteArrayInputStream input = new ByteArrayInputStream(jsonArrayNew.toString().getBytes());

        Long contentLength = Long.valueOf(jsonArrayNew.toString().getBytes().length);

        ObjectMetadata metaData = new ObjectMetadata();
        metaData.setContentLength(contentLength);

        s3.putObject(outputBucket,outputFile,input,metaData);


    }

现在,我使用下面的代码编写JSOn。

JsonArray

我在这里将String转换为OutOfMemoryException并进行写作。我担心这会很快崩溃Big Json阵列并给我OutOfMemoryException。就像我使用GSON一部分阅读Json文件一样,是否有任何方法可以逐个编写Json文件,这可以避免{{1}}问题?

1 个答案:

答案 0 :(得分:0)

我正在使用下一个代码:

WriteJsonArrayByParts<Cache> write = new WriteJsonArrayByParts<Cache>(fileNameTest, " ");
write.writeStart();
for(Cache cache : listOfObjects()) {
    write.writeObject(cache, Cache.class);
}
write.writeEnd();
write.close();

...

public static class WriteJsonArrayByParts<T> {
    Gson gson = new Gson();
    JsonWriter writer;

    public WriteJsonArrayByParts(String fileNameWithPath, String indent) throws Exception {
        OutputStream os = new FileOutputStream(fileNameWithPath, false);
        BufferedOutputStream osb = new BufferedOutputStream(os, 8 * 1024);

        writer = new JsonWriter(new OutputStreamWriter(osb, StringUtil.UTF_8));
        writer.setIndent(indent);
    }

    public void writeStart() throws IOException {
        writer.beginArray();
    }

    @SuppressWarnings("unchecked")
    public void writeObject(T t, Class<?> resultClass) throws IOException {
        ((TypeAdapter<Object>) gson.getAdapter(resultClass)).write(writer, t);
    }

    public void writeEnd() throws IOException {
        writer.endArray();
    }

    public void close() throws IOException {
        writer.close();
    }
}