Исключение в потоке "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
в следующем псевдокоде:
загрузить меньший набор данных в
smallHashSet
повторять (циклически повторять) записи в большем наборе данных, одну за другой - не загружать все сразу, просто загружать одну за другой и обрабатывать по одной:
2.1. скажем
bigSetEntry
такая запись из большего набора, тоif (smallHashSet.contains(bigSetEntry)) smallHashSet.remove(bigSetEntry)
,Когда вы закончите, тогда
smallHashSet
содержит только записи, которые находятся в маленьком наборе, но отсутствуют в большом наборе. И вам никогда не нужно было загружать большой набор сразу. Теперь вы можете сделать что-то с этими различными записями, например, добавить их в большой файл данных.