1

私は、デジタル画像相関と歪み分析を行うために使用されるオープン ソース ソフトウェア JPiv に基づいてプログラムを構築しています。残念ながら、JPiv のアルゴリズムは非常に遅いため、マルチスレッドを使用して画像セットの分析にかかる時間を短縮しようとしています。アルゴリズムは何かに JAI を使用しますが、これまで使用したことがないため、よくわかりません。それを実行すると、2 番目の「パス」で、少なくとも 1 つのスレッドで OutOfMemory 例外が発生し、他のエラーがランダムに発生することがありますが、通常は IllegalArgument 例外が発生します - 時には JAI から、時には標準 Java ライブラリから。例外は、プログラムのさまざまな時点でさまざまなライブラリによってスローされます。これにより、デバッグが困難になります。特に、何らかの理由でコンソールに常にトレースバック メッセージが表示されるとは限らないためです。

エラーは JAI.create() メソッドの使用と、上記のメソッドを使用するために異なるスレッドが corr[c] 変数にアクセスする方法にあると思います。私がやろうとしている方法で JAI.create() を使用することは可能ですか?

コードは非常に長いので、ここの Pastebin に置きました: http://pastebin.com/EX92YjXA

以下は、私が試みていることの一般的な意味を理解するための少しの疑似コードです。

public doPivEvaluation{
corr = new BufferedImage
start threads
send corr array to threads
loop until threads have finished
do stuff with corr}

public class threads{
on start{
    do the analysis using tmpCorr
    pb = new ParameterBlock()

    pb.removeSources();
    pb.removeParameters();
    pb.addSource(PivEvaluation.corr[c]);
    pb.addSource(tmpCorr);
    PivEvaluation.corr[c] = JAI.create("add",pb,null).getAsBufferedImage();

end threads}

えーと、これまでで最高の疑似コードではないかもしれませんが、そうです。corr c の位置はスレッドごとに異なり (ピクセルのセットを参照するため、異なるスレッド間で分割された画像のサイズに応じて最大 5000 になる可能性があります)、corr は揮発性であると宣言されているため、理論的には、データを上書きするべきではありません。同様に、理論的には JAI.create() がその位置だけに作用するのであれば問題ないはずです。.create() が実際にどのように機能するかを理解していないため、問題が発生します...実際のアルゴリズムは何も変更せず、複数のスレッドに移動しただけなので、すべてが単一のスレッドで機能することがわかっています。

また、コードに不適切なコーディング手法が含まれている可能性があることをお詫びします。私はまだJavaに比較的慣れていないため、混乱しているだけです。何かを試してみて問題が解決した場合、それが複数の変数宣言やその他の非効率性を意味していても、それを使用する可能性があります。これは私が遭遇した最初の問題であり、当て推量と Google によって修正できませんでした。

4

0 に答える 0