我想处理一个文本文件(大约 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()
进行字符串到整数的转换,并且整数应始终小于相应的字符串。
其他建议:替换您的 ArrayList
与 HashSet
如果您不关心重复项。
根据 outofBounds 的回答,您不需要克隆 ArrayList
每次您想向其中添加项目时。
关于Java堆空间: Hashmap, ArrayList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9619092/