如何有效地处理巨大的JSON文件,需要一些想法

时间:2015-08-21 19:45:18

标签: java json multithreading filesplitting

这是一个关于思路的问题,所以请不要让我使用第三方库来解决这个问题。

最近,我接受了一次面试,有以下问题:

有一个庞大的JSON文件,结构类似于数据库:

    {
    "tableName1 ":[
       {"t1field1":"value1"},
       {"t1field2":"value2"},
          ...
       {"t1fieldN":"valueN"}
        ], 
    "tableName2 ":[
       {"t2field1":"value1"},
       {"t2field2":"value2"},
          ....
       {"t2fieldN":"valueN"}
        ],
        .......
        .......
     "tableNameN ":[
       {"tNfield1":"value1"},
       {"tNfield2":"value2"},
          ....
       {"tNfieldN":"valueN"}
    ]
   }

要求是:

  1. 通过给定的子节点名称找到一些特殊的子节点,并更新它的字段值,然后将其保存到新的JSON文件中。
    1. 计算给定字段的名称和值的数量。
  2. 当它是一个正常大小的JSON文件时,我编写了一个Utility类来从本地加载JSON文件并将其解析为JSON Object。然后我写了两个方法来处理这两个要求:

    void upDateAndSaveJson(JSONObject json, String nodeName,
                Map<String, Object> map, Map<String, Object> updateMap,
                String outPath) {
         //map saved target child-node's conditions
         //updateMap saved update conditions
         // first find the target child-node and update it finally save it
         // ...code ... 
    }
    int getCount(JSONObject json, Map<String, Object> map) {
      //map saved field target field/value 
      // ...code...
    }
    

    但面试官让我思考JSON文件非常庞大的情况,然后修改我的代码以及如何使其更有效。

    我的想法是编写一个工具来首先拆分JSON文件。因为最后我需要使用JSON对象来调用前两个方法,所以在分割巨大的JSON文件之前我知道两个方法的参数:一个Map(保存的目标子节点的条件/或字段目标字段/值),nodeName (子节点名称)

    所以当我加载JSON文件时,我将输入流String与taget nodeName进行比较,然后开始计算子节点的对象数,如果规则是100,那么当它有100个对象时,我将子进行分割-node到一个新的较小的JSON文件,并在源JSON文件中删除它。

    如下所示:

       while((line = reader.readLine()) != null){           
            for (String nodeName : nodeNames) {
                //check if its' the target node
                if (line.indexOf(nodeName) != -1) {
                    //count the target child-node's object 
                    //and then split to smaller JSON file
                }   
            }
        }
    

    之后,我可以使用多个线程加载之前创建的较小的JSON文件,并调用两个方法来处理JSON对象。

    这是一个关于思路的问题,所以请不要告诉我你可以使用第三方库来解决这个问题。

    所以如果我的可行性呢?或者你们有其他想法,请分享。

    感谢。

0 个答案:

没有答案