我正在构建一个基于开源软件JPiv的程序,用于进行数字图像相关和应变分析。不幸的是,JPiv中的算法非常慢,所以我一直在尝试使用多线程来减少分析图像集所花费的时间。该算法使用JAI的东西,不太确定我之前从未使用过的东西。当我运行它时,在第二个'pass'上,我在至少一个线程上得到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()实际上是如何工作的...我知道整个事情在单个线程中工作,因为我没有改变任何实际算法,只是将它移动到多个线程中。 / p>
此外,对于代码中可能存在的任何错误编码实践表示道歉,我对Java仍然相对较新,所以我更喜欢混淆。如果我尝试了一些并解决了问题,我很可能会继续使用它,即使它意味着多个变量声明或我所做的其他任何低效率。这是我遇到的第一个问题,我无法通过猜测和谷歌来修复。