1

我正在构建一个基于开源软件 JPiv 的程序,用于进行数字图像相关和应变分析。不幸的是,JPiv 中的算法非常慢,所以我一直在尝试使用多线程来减少分析图像集所花费的时间。该算法使用 JAI 来做某事,不太确定是什么,因为我以前从未使用过它。当我运行它时,在第二次“通过”时,我在至少一个线程上得到了 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 已被声明为 volatile,因此理论上不应该覆盖数据。同样,理论上,如果 JAI.create() 只作用于那个位置,也应该没有问题。问题的出现是因为我不明白 .create() 实际是如何工作的……我知道整个事情在一个线程中工作,因为我没有改变任何实际算法,只是将它移动到多个线程中。

此外,对于代码中可能存在的任何不良编码实践,我深表歉意,我对 Java 还是比较陌生,所以我只是在糊里糊涂。如果我尝试某事并解决了问题,我可能会继续使用它,即使这意味着多个变量声明或我所做的任何其他低效率。这是我遇到的第一个问题,我无法通过猜测和谷歌来解决。

4

0 回答 0