0

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

下面给出了虚拟代码,您可以假设 hashset1(这是一些缺失的数据)作为文件读取器数据,hashset2(来自 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)
4

1 回答 1

0

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

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

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

    2.1。假设bigSetEntry是来自更大集合的这样一个条目,那么
    if (smallHashSet.contains(bigSetEntry)) smallHashSet.remove(bigSetEntry).

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

于 2017-09-22T09:59:31.837 回答