java.lang.OutOfMemory线程"main"异常错误:尝试验证数百万数据时 Java 堆空间



来自平面文件,该文件包含行划分的数据,我的任务是从db验证的不存在的数据,我试图使用Java首先验证我已将平面文件数据插入HashSet1和另一个HashSet2对于DB数据之后,我试图检查HashSet1.Contain(HashSet2),以便我可以识别DB中不存在的数据。

下面给出的是虚拟代码,您可以假定HashSet1(其中一些丢失的数据)作为文件读取器数据和HashSet2(来自DB的完整数据)作为DB Data

但是,正如我在这里提到的,我需要验证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.)中就足够了(1.),然后,作为下一步,检测集合的差异(2.),然后根据发现的差异修改数据(3.)。让我们在以下伪代码中称为小型集smallHashSet

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

  2. 迭代(循环)在更大的数据集中的条目上,一一 - 不要一次加载一次,只要一个接一个地加载一个然后一次处理一个:

    2.1。假设bigSetEntry是从较大组中的条目,然后是
    if (smallHashSet.contains(bigSetEntry)) smallHashSet.remove(bigSetEntry)

  3. 完成后,smallHashSet仅包含小集合中的条目,但在大集合中缺少。而且您永远不需要一次加载大型集合。您现在可以使用这些不同的条目来做些事情,例如将它们添加到大数据文件中。

最新更新