Каков эффективный способ вычисления евклидова расстояния между элементами в n-мерном большом ArrayList с помощью JAVA? - PullRequest
0 голосов
/ 13 января 2019

Я хочу вычислить Евклидово расстояние между каждой парой элементов в списке двумерного массива в JAVA . Этот список двухмерного массива состоит из 40000 записей в 40 измерениях. Я столкнулся с проблемой дефицита памяти:

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

Я увеличил размер кучи-памяти до: Xmx16000M (16 ГБ ОЗУ). но проблема также существует. Итак, как я могу избавиться от проблемы с нехваткой памяти? Ниже вы можете увидеть псевдокод , который точно описывает мой код. Спасибо всем опрошенным.

ArrayList<ArrayList<Double> dataset = new ArrayList<ArrayList<Double>>();
dataset = readDataset(); // a method returns data to my 2-d arraylist
                         //now I have 40000 records in 40 dim in dataset!
distanceMatrix = new double[dataset.size()][dataset.size()];

for (int i=0 ; i<dataset.size(); i++) {
    for (int j=0 ; j<(dataset.size()-i); j++) {
        if (i == j) {
            distanceMatrix[i][j] = 0.0;
            continue;
        }
        double ans= getDistance(dataset.get(i), dataset.get(j));
        distanceMatrix[i][j] = ans;
        distanceMatrix[j][i] = ans;
    }
}

public double getDistance(ArrayList<Double> a , ArrayList<Double> b) {
    double dist=0;
    for (int i = 0; i < 40; i++) { 
        double c = Math.abs(a.get(i) - b.get(i));
        dist += Math.pow(c, 2);
    }
    dist = Math.sqrt(dist);
    return dist;
}
...