ポイント座標の倍数配列をとり、その中間点を追加する、この非常に単純なコードを書いています。私は実行するときに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();
}
}
コードをより読みやすくしてください - 実際のソースコードのようにインデントされていますか?最終的には、 'a.length'について知らなくても、何が間違っているのかを正確に調べることは難しいでしょう。 (あなたはそれらがすべて500未満だと言っていますが、確かに正しいですか?それを示す診断を含んでいますか?) –
配列の長さはどれくらいですか?現在のメモリ/ヒープサイズの設定は? – Amit
@JonSkeetこのメソッドはループ内のメインクラスで使用され、プロジェクト全体が手書き認識になります。メインクラスも含めることができますが、プロジェクト全体が非常に大きい場合を除いては意味がありません。 mainメソッドは、オンラインの手書き認識データを含むファイルのリスト上のシェルスクリプトによって呼び出されます。これらのファイルは間違いなく500ポイントを超えていません。 –