0

マップ内の距離を取得しようとしていますが、Javaヒープエラーが発生しています。データがマップに格納されていると、なぜか特別な理由がわかりません。ここでJavaヒープエラー

が私のコードです:

Map<Integer, double[]> getDistanceTable(Map<String, Double[]> vectors) { 
    Map<Integer, double[]> distance = new HashMap<>(); 
    int size = vectors.keySet().size(); 
    for(int i=0; i<vectors.keySet().size(); i++) { 
     double[] features = new double[size]; 
     int index = 1; 
     features[0] = 0; 
     for(int j = i+1; j<vectors.keySet().size(); j++) {     
      features[index] =new QueryClustering().getDistance(vectors.get(i), vectors.get(j)); 
      index++; 
     } 
     distance.put(i, features); 
     size--; 
    }  
    return distance; 

} 
} 
+0

getDistanceは大きなオブジェクトを返し、あなたがこのタイプの非常に多くのインスタンスを持っているかもしれない新しいQueryClustering()ので。ヒープに収まらないマップ –

+0

各繰り返しで新しいQueryClusteringオブジェクトを作成しないでください。 'for'の外に作成し、 'for'句の中でメソッドgetDistance(...)を呼び出してみてください。 –

+0

正確なエラーメッセージを含め、詳細を教えてください。私が見ることができる(関連のない)問題は、あなたが 'vectors.get(i)'をやっているということです。 'i'は' int'ですが、 'vectors'のキータイプは' String'です。 –

答えて

0

この修正を試してください:

Map<Integer, double[]> getDistanceTable(Map<String, Double[]> vectors) { 

    // Define it once, call it multiple times inside 'for' clause: 
    QueryClustering queryClustering = new QueryClustering(); 

    Map<Integer, double[]> distance = new HashMap<>(); 
    int size = vectors.keySet().size(); 
    for(int i=0; i<vectors.keySet().size(); i++) { 
     double[] features = new double[size]; 
     int index = 1; 
     features[0] = 0; 
     for(int j = i+1; j<vectors.keySet().size(); j++) {     
      features[index] = queryClustering.getDistance(vectors.get(i), vectors.get(j)); 
      index++; 
     } 
     distance.put(i, features); 
     size--; 
    }  
    return distance; 
} 
+0

ありがとうございますが、エラーはそのまま残り、何も変更されていませんでした:( – Ffm

+0

@Nicolas Filotto 100,000以上のキーがあり、各キーには16個の値を持つ[]が付いています – Ffm

+0

@Adnan:コードを改善していきます。 Map distance = new HashMap (); また、最新の改善( 'for'節の外にQueryClusteringを作成)をしてください。 –

関連する問題