Java堆空间: Hashmap, ArrayList

标签 java arraylist hashmap heap-memory

我想处理一个文本文件(大约 400 MB),以便根据每行给出的数据创建递归父子结构。必须为自上而下的导航准备数据(输入:父级,输出:所有子级和子级)。例如。要读取的行数: (,id1,id2,,id3)

132142086;1;2;132528589;132528599
132142087;1;3;132528589;132528599
132142088;1;0;132528589;132528599
323442444;1;0;132142088;132528599
454345434;1;0;323442444;132528599

132528589:是 132142086,132142087,132142088 的父级
132142088:是 323442444 的父级
323442444:是 454345434 的父级

给出:操作系统 windows xp,32 位,2GB 可用内存和 -Xmx1024m 这是我准备数据的方法:

HashMap<String,ArrayList<String>> hMap=new HashMap<String,ArrayList<String>>();
  while ((myReader = bReader.readLine()) != null) 
          {
             String [] tmpObj=myReader.split(delimiter);
                   String valuesArrayS=tmpObj[0]+";"+tmpObj[1]+";"+tmpObj[2]+";"+tmpObj[3]+";"+tmpObj[4];
                        ArrayList<String> valuesArray=new ArrayList<String>();
                        //case of same key
                        if(hMap.containsKey(tmpObj[3]))
                            {
                            valuesArray=(ArrayList<String>)(hMap.get(tmpObj[3])).clone();
                            }

                        valuesArray.add(valuesArrayS);
                        hMap.put(tmpObj[3],valuesArray);
                        tmpObj=null;
                        valuesArray=null;
                        }

return hMap;

之后我使用递归函数:

HashMap<String,ArrayList<String>> getChildren(input parent)

用于创建所需的数据结构。计划是使用 getChildren 函数让 hMap 对多个线程可用(只读)。
我用 90 MB 的输入文件测试了这个程序,它似乎工作正常。但是,使用超过 380 MB 的真实文件运行它会导致:
线程“main”中的异常 java.lang.OutOfMemoryError: Java 堆空间
我需要内存资源管理方面的帮助

最佳答案

从“简单方法”的角度来看:根据您的问题陈述,您不需要保留 id1、id2 或 id3。假设是这种情况,那么替换您的 HashMap<String, ArrayList<String>> 怎么样?与 HashMap<Integer, ArrayList<Integer>> ?您可以使用Integer.parseInt()进行字符串到整数的转换,并且整数应始终小于相应的字符串。

其他建议:替换您的 ArrayListHashSet如果您不关心重复项。

根据 outofBounds 的回答,您不需要克隆 ArrayList每次您想向其中添加项目时。

关于Java堆空间: Hashmap, ArrayList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9619092/

相关文章:

java - Spring Batch 适合我的服务代码吗?

java - 将文件输出流转换为字符串

Java hashCode 不适用于 HashMap?

java - for循环内延迟,每2秒制作一次 toast

java - 如何测试java代码?

arraylist - 在 Zig 中改变数组列表中的值

java - 为json数据编写junit测试用例

c++ - 在编译时创建大型 HashMap 的最佳方法(C++)?

java - arraylist迭代器,不打印第一行

java - 如何避免 arraylist 的嵌套 for 循环,java