Исключение в потоке "main" java.lang.OutOfMemoryError: пространство кучи Java при попытке проверить миллионы данных

Из простого файла, содержащего данные построчно, моя задача проверить данные из БД отсутствует. Я пытаюсь проверить. Сначала я использую Java. Я вставил данные плоского файла в HashSet1 и другой Hashset2. Для данных БД после этого я пытаюсь проверить Hashset1..Contain(Hashset2), чтобы я мог определить, какие данные не присутствуют в БД.

Ниже приведен фиктивный код, который можно принять в качестве hashset1(который представляет собой некоторые отсутствующие данные) в качестве данных File Reader, а hashset2(полные данные из db) в качестве данных DB

но, как я уже упоминал, у меня есть 30 миллионов данных для проверки, я могу проверить 1 миллион данных таким образом, но не могу проверить 30 миллионов данных, что является моей задачей. Есть ли лучший способ сделать это любезно предложить и какой-то код, который мы будем очень благодарны.

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 содержит только записи, которые находятся в маленьком наборе, но отсутствуют в большом наборе. И вам никогда не нужно было загружать большой набор сразу. Теперь вы можете сделать что-то с этими различными записями, например, добавить их в большой файл данных.

Другие вопросы по тегам