线程" main"中的例外情况java.lang.OutOfMemoryError:尝试验证数百万个数据时的Java堆空间

时间:2017-09-22 09:28:26

标签: java database file out-of-memory java-memory-leaks

从包含数据的平面文件逐行,我的任务是验证来自DB的数据不存在我试图验证首先使用Java我已将平面文件数据插入HashSet1和另一个Hashset2 For DB数据之后我正在尝试检查Hashset1.Contain(Hashset2),以便我可以识别数据库中不存在哪些数据。

下面给出了Dummy Code,你可以将hashset1(这是一些缺失的数据)作为文件读取器数据和hashset2(来自db的完整数据)作为DB数据

但正如我在此提到的,我需要验证3000万个数据,我能够通过这种方式验证100万个数据,但无法验证3000万个数据,这是我的任务。有没有最好的方法来做这个建议和某种代码,我们将非常感谢。

public class App 
{

    public static void sampleMethod() {
        Set<Integer> hashset1 = new HashSet<Integer>();
        Set<Integer> hashset2 = new HashSet<Integer>();
        for(int i = 0; i<30000000; i++ ) {
            if(i %50000 != 0) {
                hashset1.add(i);
            }
        }
        int count = 0;
        for(int j =0;j<30000000;j++) {
            if(hashset1.contains(j)) {
                count++;
            } else {
                System.out.println(j+" Is Not Present");
                hashset2.add(j);
            }
        }
        System.out.println("Contain Value Count" + count);  

    }
    public static void main( String[] args )
    {
        sampleMethod();
    }
}

错误堆栈跟踪:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at java.util.HashMap.resize(HashMap.java:703)
    at java.util.HashMap.putVal(HashMap.java:662)
    at java.util.HashMap.put(HashMap.java:611)
    at java.util.HashSet.add(HashSet.java:219)
    at com.java.anz.BankingPro.App.sampleMethod(App.java:20)
    at com.java.anz.BankingPro.App.main(App.java:38)

1 个答案:

答案 0 :(得分:0)

对于组合两组数据,只需将两者中较小的一组加载到一个哈希集(1.)中,然后,作为下一步,检测组的差异(2.),然后根据找到的差异(3.)修改数据。让我们在下面的伪代码中简单地调用小集smallHashSet

  1. 将较小的数据集加载到smallHashSet

  2. 逐个迭代(循环)更大的数据集中的条目 - 不要一次加载所有数据,只需一个接一个地加载并一次处理一个:

    2.1。让我们说bigSetEntry是从更大的集合中进入的一个条目,然后是 if (smallHashSet.contains(bigSetEntry)) smallHashSet.remove(bigSetEntry)

  3. 完成后,smallHashSet仅包含小集合中的条目,但在大集合中缺失。你永远不需要一次装入大套装。您现在可以使用这些不同的条目执行某些操作,例如将它们添加到大数据文件中。