2011-12-14 6 views
0

ポイント座標の倍数配列をとり、その中間点を追加する、この非常に単純なコードを書いています。私は実行するときにOutOfMemoryError: Java heap spaceと時々OutOfMemoryError: GC overhead limit exceededを取得し続ける。それを動作させる唯一の方法は、最後にif elseステートメントを追加して、1000より長いすべての新しい配列を取り除く場合です。私はこのelse if文を使用したときに意味をなさないようにしようとしていましたが、解析されている配列のどれもが500(出力配列は常にlength * 2 - 1)より大きくないので、さらに混乱します。私はコンピュータがクラッシュして何も変更していない限り、可能な限りヒープスペースを増やしてみました。私は本当に私のコードで何かが間違って見ることができない、私は何時間もそれを見てきた!説明できない "OutOfMemoryError:Javaヒープスペース"エラーとコードの動作

おかげで、どんな助けでも大歓迎です!

public float[][] smooth(float a[][]){ 
     int length = a.length; 
     float b[][] = new float[(length*2)-1][2]; 
     int x = 0; 

     for (int i = 0; i < length; ++i){ 
      b[i+x] = a[i]; 
      x += 1; 
      if (i < length-1) 
       b[i+x] = midPoint(a[i], a[i+1]); 
     } 

//  if (b.length < 1000) 
      return b; 
//  else 
//   return a; 
    } 

    public static float[] midPoint(float a[], float b[]){ 
     int length = a.length; 
     float c[] = new float[length]; 

     for(int i = 0; i < length; ++i) 
      c[i] = (a[i] + b[i])/length; 

     return c; 
    } 
} 

メインクラス:

import java.lang.*; 
import java.io.*; 
import java.util.*; 
import hwr.*; 

public class DTWDist { 
public static void main(String[] args) { 

    MyClass2 mc2 = new MyClass2(); 

    if (args.length != 2) { 
     System.out.println("Perform dynamic time warping alignment on reference patterns"); 
     System.out.println("usage: input_list ref_list"); 
     System.out.println("output format: input_id ref_id distance"); 
     System.exit(-1); 
    } 

    TimeWarping warpFun = new DynamicTimeWarping(new SquaredEuclidDistance()); 
    float input_pats[][][]; 
    float ref_pats[][][]; 
    PenDataReader reader = new PenDataReader(true); 
    input_pats = reader.readFileList(args[0]); 
    ref_pats = reader.readFileList(args[1]); 

    for (int i = 0; i < input_pats.length; ++i){ 
     for (int j = 0; j < ref_pats.length; ++j){ 

      input_pats[i] = mc2.smooth(input_pats[i]); 
      ref_pats[j] = mc2.smooth(ref_pats[j]); 
      input_pats[i] = mc2.centroid(input_pats[i]); 
      ref_pats[j] = mc2.centroid(ref_pats[j]); 
     } 
    } 

    for (int i = 0; i < input_pats.length; ++i) { 
     for (int j = 0; j < ref_pats.length; ++j) { 

      System.out.println(i + " " + j + "\t" + warpFun.calcDistance(input_pats[i], ref_pats[j])); 
     } 
     System.out.println(); 
    } 
    System.out.println(); 
} 
} 
+0

コードをより読みやすくしてください - 実際のソースコードのようにインデントされていますか?最終的には、 'a.length'について知らなくても、何が間違っているのかを正確に調べることは難しいでしょう。 (あなたはそれらがすべて500未満だと言っていますが、確かに正しいですか?それを示す診断を含んでいますか?) –

+0

配列の長さはどれくらいですか?現在のメモリ/ヒープサイズの設定は? – Amit

+0

@JonSkeetこのメソッドはループ内のメインクラスで使用され、プロジェクト全体が手書き認識になります。メインクラスも含めることができますが、プロジェクト全体が非常に大きい場合を除いては意味がありません。 mainメソッドは、オンラインの手書き認識データを含むファイルのリスト上のシェルスクリプトによって呼び出されます。これらのファイルは間違いなく500ポイントを超えていません。 –

答えて

0

私は、比較的小さな配列サイズとその作業罰金でこのコードをテストしています。だからあなたが使用している配列のサイズとあなたが持っているヒープ設定を知る必要があります。

+0

ヒープサイズは200 MBに設定されています。私は、すべてのファイルを個別にスクリプトを実行しただけで動作するように見えるので、エラーメッセージでこの問題が指摘されていますが、問題は別のクラスにある可能性があります。私は今、「スムーズ」と呼ばれるメインクラスを修正するでしょう –

0

'b'配列が宣言された後で、そのサイズを変更するものはありません。したがって、500より大きいサイズの配列 'a'を渡す必要があります。

if文を戻し、デバッグするためにブレークポイントを入れてください。私はあなたがそうしたら、物事は非常に迅速になると思う。

編集:問題がスムーズなメソッドを呼び出すコードにあることがわかります。

+0

はい、あなたは絶対に正しいです、私はすべてのファイルを個別にテストし、うまくいきました。 –

関連する問題