在显示整个hashmap时面临问题 - java堆空间

时间:2014-05-16 17:22:22

标签: java memory hashmap heap

public static void main(String args[]) throws FileNotFoundException, IOException
{


    FileReader in = new FileReader("/home/aoblah/Downloads/file1.txt");
    BufferedReader br = new BufferedReader(in);



   // Scanner in = null;
    String answer = null;
    String verb = null;
    String line = null;
    String [] split_npn = null;
    String [] split_pn = null;
    String [] split_dp2 = null;
    String [] split_dp3 = null;

    HashMap<String, HashMap<String, ArrayList<String>>> hmap = new HashMap<String, HashMap<String, ArrayList<String>>>();

    try {


        while ((line = br.readLine()) != null)
        {
            if(line.contains("verb"))
            {

                 verb = line.substring(0, line.indexOf("("));

                if(line.contains("npn")){
                    String test = line.substring(line.indexOf("npn"));
                    answer = test.substring(test.indexOf("npn"),test.indexof(']')); 

                    answer = answer.replace(",", " " );                        
                    split_npn = answer.split(" ");
                }




                if(line.contains("pn")){
                    String test = line.substring(line.indexOf("pn"));
                    answer = test.substring(test.indexOf("pn"), test.indexOf(']'));
                    answer = answer.replace(",", " " );                        
                    split_pn = answer.split(" ");
                }

                if(line.contains("dp2")){
                    String test = line.substring(line.indexOf("dp2"));
                    answer = test.substring(test.indexOf("dp2"), test.indexOf(']'));
                    answer = answer.replace(",", " " );                        
                    split_dp2 = answer.split(" ");
                }
                if(line.contains("dp3")){
                    String test = line.substring(line.indexOf("dp3"));
                    answer = test.substring(test.indexOf("dp3"), test.indexOf(']'));
                    answer = answer.replace(",", " " ); 
                    split_dp3 = answer.split(" ");
                }                    


            }

            if(split_npn != null){
                ArrayList<String> npn = new ArrayList<String>();
                hmap.put(verb, new HashMap<String, ArrayList<String>>());
                for(int i = 1; i< split_npn.length; i++){
                    npn.add(split_npn[i]);
                }
                npn.trimToSize();
                hmap.get(verb).put("npn", npn);
            }

            if(split_pn != null){
                ArrayList<String> pn = new ArrayList<String>();
                hmap.put(verb, new HashMap<String, ArrayList<String>>());
                for(int i = 1; i< split_pn.length; i++){
                    pn.add(split_pn[i]);
                }
                pn.trimToSize();
                hmap.get(verb).put("pn", pn);
            }                

            if(split_dp2 != null){
                ArrayList<String> dp2 = new ArrayList<String>();
                hmap.put(verb, new HashMap<String, ArrayList<String>>());
                for(int i = 1; i< split_dp2.length; i++){
                    dp2.add(split_dp2[i]);
                }
                dp2.trimToSize();
                hmap.get(verb).put("dp2", dp2);
            }                                

            if(split_dp3 != null){
                ArrayList<String> dp3 = new ArrayList<String>();
                hmap.put(verb, new HashMap<String, ArrayList<String>>());
                for(int i = 1; i< split_dp3.length; i++){
                    dp3.add(split_dp3[i]);
                }
                dp3.trimToSize();
                hmap.get(verb).put("dp3", dp3);
            } 

            System.out.println(hmap);

        }

    }


    catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

该文件包含

等条目

平静(动词,NAUX,[nullobj,[DP2,向下],[DP3,向下],镇静)。
镇静(动词,[SG],平静)。
平静(动词,[SG,PL,CN],平静)。
平静(动词,[PL,INF〕,平静)。
镇静(动词,[和],平静)。
从容(ADV,MV,从容)。
平静(名词,[SG],平静)。

我将所有动词,与之关联的介词的类别以及介词存储在嵌套的哈希映射中。 我只打印一个与动词相关的特定类型的介词时没有问题,但是当我显示整个hashmap时,程序只运行并且永不停止...最终在java中出现空间堆错误。我该如何解决这个记忆问题?

2 个答案:

答案 0 :(得分:0)

一个建议是,而不是做System.out.println(hmap);

尝试将其打印出来:

for(String outerKey: hmap.keySet())
{
   System.out.println(outerKey + ": ");
   Map inner = hmap.get(outerKey);
   for(String innerKey : innerMap)
   {
    System.out.print(innerKey + ": ");
    System.out.println(innterMap.get(innerKey).toString());
   }

}

答案 1 :(得分:0)

使用

打印地图
System.out.println(hmap)

这使用toString()的{​​{1}}方法,该方法在内存中为整个输出构建一个大字符串。根据输入文件读取的大小,这可能是很多内存。

打印迭代条目的地图会更好:

HashMap

这将为一个条目分配内存,打印它,将它交给垃圾收集器并取下一个条目。