繁体   English   中英

需要有关Java结果集的帮助。 堆空间不足

[英]Need help on Java Resultset. Running out of Heap Space

在以下情况下需要有效的内存管理方面的帮助。 我正在从两个不同的数据库中获取数据并比较Java中的数据。(当前在具有两个查询的单个数据库上进行测试)。

由于需要比较980万条记录,因此我每次都要复制5万条记录,并将其加载到ArrayList中,然后使用Binarysearch进行比较。 尽管我每次迭代后都会清除(分配为null并运行gc)阵列列表,但是在比较250万条记录后却遇到了堆空间错误(分配1GB RAM)。

我的查询中的内存泄漏在哪里?

Query1= select empno,ename from table1 order by empno;
Query2= select empno,ename from table2 order by empno;

ResultSet rs1 = st1.executeQuery(query1);
ResultSet rs2 = st2.executeQuery(query2);               
for (;;) {
    ArrayList<String> al = new ArrayList<String>();
    ArrayList<String> al1 = new ArrayList<String>();

    if (totalRecords1 == Ubound)
        break;

    Lbound = Ubound + 1;
    Ubound = min(Ubound + 50000, totalRecords1);
    System.out.println("Lbound : " + Lbound);
    System.out.println("Ubound : " + Ubound);

    for (int i = Lbound; i <= Ubound; i++) {
        recordConcat1 = ""; recordConcat2 = "";
        String recordConcat1 = "", recordConcat2 = "";
        rs1.next();
        rs2.next();

        recordConcat1 = recordConcat1 + rs1.getString(z) + " ǀ ";
        recordConcat2 = recordConcat2 + rs2.getString(z) + " ǀ ";

        al.add(recordConcat1);

        al1.add(recordConcat2);

    }  /* End of First Lap */ 

    System.out.println("End of Lap : "+lap++);

    int index =0;
    for(int like=0;like<al.size();like++) {

        if(Collections.binarySearch(al1,al.get(like))>=0)
            continue;
        else {
            System.out.println("Not matched : "+ al.get(like));
            break;
        }
    }

    al =null;
    al1=null;
    System.gc();

} /* End of Infinite Loop */ 

而不是将ArrayLists设置为null并调用GC。 调用ArrayList.clear()不会释放ArrayLists的内存,但会重用它。 此外,因为您的上限固定为50000,所以应将该数字传递给ArrayList的构造函数,以避免动态分配内存,同时自动将ArrayLists从其默认初始大小10增加。

另一方面,如果我没看错的话,您要达到的目的是告诉一个表中的每个元素是否都在另一个表中。 由于对数据进行了排序,因此您可以执行以下操作,而无需将块加载到内存中,而是并行读取两个ResultSet。

我认为即使没有内存不足错误,您的算法也无法正常工作。 您从表A中读取了50K,从表B中读取了50K。现在在块A上搜索块B的每个元素。但是,如果B的前50000中的元素位于A的位置50001,会怎样呢?它是。 对?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM