Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 巨大的Json解析器_Java_Json - Fatal编程技术网

Java 巨大的Json解析器

Java 巨大的Json解析器,java,json,Java,Json,我有一个用Java制作的自定义解析器,我想将一个3,6 GB的Json导出到一个Sql Oracle数据库中。对于8MB的Json示例,导入工作正常。但是当我尝试解析整个3,6 GB JSON时,出现了一些内存问题,即java.lang.OutOfMemoryError 我已经使用-Xmx5000m为此分配了5gb的内存。我的笔记本电脑内存充足 正如你所看到的,我还有记忆。发生此错误是因为CPU的原因吗 更新: Json表示来自自由代码营的数据: 数据如下所示: [ { “名称”:“航路点:

我有一个用Java制作的自定义解析器,我想将一个3,6 GB的Json导出到一个Sql Oracle数据库中。对于8MB的Json示例,导入工作正常。但是当我尝试解析整个3,6 GB JSON时,出现了一些内存问题,即java.lang.OutOfMemoryError

我已经使用-Xmx5000m为此分配了5gb的内存。我的笔记本电脑内存充足

正如你所看到的,我还有记忆。发生此错误是因为CPU的原因吗

更新: Json表示来自自由代码营的数据:

数据如下所示:

[ { “名称”:“航路点:向HTML元素问好”, “完成日期”:1445854025698, “解决方案”:“Hello World\n” } ]

正如我所说的,我用8MB的Json样本对相同的数据进行了解析,结果成功了。那么代码真的是问题所在吗

这里有一些代码

enter code here
public class MainParser {

public static void main(String[] args) {
    //Date time;
    try {
        BufferedReader br = new BufferedReader(
                new FileReader("output.json")); //destination to json here
        Gson gson = new Gson();
        Type collectionType = new TypeToken<List<List<Tasks>>>() {
        }.getType();
        List<List<Tasks>> details = gson.fromJson(br, collectionType);

        DBConnect connection = new DBConnect("STUDENT","student");
        connection.connect();

    for (int person=0;person<details.size();person++)
    {

        for (int task = 0; task < details.get(person).size(); task++)
        {
            connection.insert_query(person + 1,
                    task + 1,
                    details.get(person).get(task).getName(),
                     (details.get(person).get(task).getCompletedDate()/1000),
                    details.get(person).get(task).getSolution());
        }
    }
    } catch (IOException e) {
        e.printStackTrace();
    } catch (SQLException e) {
        e.printStackTrace();
    }
}
}
解析JSON(或者其他任何东西)不会占用与原始文件大小相同的内存

表示对象的每个JSON字符串块都将成为一个对象,为已加载的JSON添加内存。如果您使用某种流解析它,您仍然会添加内存,但要少得多(您不会在内存中保存整个3.6GB文件)

尽管如此,对象需要比字符串更多的内存来表示。如果您有一个数组,它可能被解析为一个列表,那么该列表就有开销。将这个开销乘以JSON中的实例(相当多,在一个3.6GB的文件中),最终得到的结果远远超过了3.6GB的内存

但是如果您想将其解析为流,并在其进行时处理每个记录,然后丢弃它,您可以这样做。在这两种情况下,使用流都需要一个组件来解析JSON并让您处理每个解析的对象。如果你知道它的结构,你自己写一本可能会更容易

希望有帮助。

请参阅


当无法将整个模型加载到内存中时,使用此选项。您需要使用基于事件/流式JSON解析器。其思想是,解析器不是一次性解析整个JSON文件并将其保存在内存中,而是在每个重要语法单元的开始和结束处发出“事件”。然后编写代码来处理这些事件,并将这些信息进行附加和组装,然后(在您的情况下)将相应的记录插入数据库

以下是开始阅读Oracle的JSON流API的一些地方:

以下是GSON等效产品的文档链接:


不要发布文本信息的屏幕截图。将相关信息和格式复制/粘贴为代码(缩进4个空格),用于堆栈跟踪等。在问题中附加一些代码将有助于回答每个json记录是否代表一行?这就是我正在解析的json尝试使用
流式处理
方法解析json:谢谢,这很有帮助,我将修改解析这个JSON的方法。谢谢,我会检查一下。
enter code here
public void insert_query(int person_id, int task_id, String taskName, double       date, String solution) throws SQLException {


           Statement stmt = conn.createStatement();
    try {
        String query = "INSERT INTO FreeCodeCamp VALUES(?,?,?,?,?)";
        PreparedStatement ps = conn.prepareStatement(query);
        ps.setInt(1,person_id);
        ps.setInt(2,task_id);
        ps.setString(3,taskName);
        ps.setDate(4,null);
        ps.setString(5,solution);
        /*stmt.executeUpdate("INSERT INTO FreeCodeCamp VALUES("
                + person_id + ","
                + task_id + ","
                + "'" + taskName + "',"
                + "TO_TIMESTAMP(unix_ts_to_date(" + date + "),'YYYY-MM-DD HH24:MI:SS'),"
                + "'" + solution + "')");
        stmt.close();*/
        ps.execute();
        ps.close();
    } catch (SQLException e) {
        e.printStackTrace();
    }