Matlab:使用spmd中的第三方java类

时间:2011-11-30 19:09:28

标签: java matlab parallel-processing

我正在尝试使用来自spmd内的第三方Java库的类,但我一直收到与导入它相关的各种错误。

这是一个相当小的例子:

spmd (1)
    javaaddpath([pwd 'lib/guava-10.0.1.jar']);
    import com.google.common.collect.MinMaxPriorityQueue;
    pq = MinMaxPriorityQueue.create();
end

这给了我错误

??? Error: MATLAB cannot determine whether "MinMaxPriorityQueue" refers to a
function or variable.
See <a href="matlab: helpview([docroot
'/toolbox/distcomp/distcomp_ug.map'],'SPMD_LIMITATIONS')">SPMD in MATLAB,
"Limitations"</a>.

(当然,that "Limitations" document似乎没有任何特别相关的内容。)

javaaddpath和/或import移到spmd块之外无济于事;在没有import的情况下执行此操作,而只是说pq = com.google.common.collect.MinMaxPriorityQueue.create会导致它出现与com相同的错误。

调用spmd块之外定义的匿名函数会产生不同的错误:

javaaddpath([pwd '/lib/guava-10.0.1.jar']);
make_pq = @() com.google.common.collect.MinMaxPriorityQueue.create();
spmd (1)
    javaaddpath([pwd '/lib/guava-10.0.1.jar']);
    pq = make_pq();
end

让我

The class "com.google.common.collect.MinMaxPriorityQueue" is undefined.
Perhaps Java is not running.

但是Java肯定在运行,因为

spmd (1)
   pq = java.util.PriorityQueue();
end

spmd (1)
    javaaddpath([pwd '/lib']);
    pq = ArrayPriorityComparator.create();
end

work(ArrayPriorityComparator./lib)中的独立java类。

这对我来说就像Matlab解析spmd块一样。但我不认为我可以使用javaObject()javaMethod()来解决它,因为我必须调用一个静态方法来创建对象,我不能把它放在{{{ 1}}因为我得到eval(或者,如果我把它放在Transparency violation error之外定义的匿名函数中,我会得到相同的spmd错误。

有什么想法吗?真正的解决方案或可怕的糟糕黑客都是受欢迎的。

2 个答案:

答案 0 :(得分:2)

我想这是另一个'动态类路径'问题。有关如何使用'static classpath'的信息,请参阅Bringing Java Classes and Methods into MATLAB Workspace

如果您不依赖静态类路径,请使用以下帖子中描述的方法。

答案 1 :(得分:0)

您是否尝试过使用pctRunOnAll来设置java路径?

我担心我没有一个方便的集群来测试是否可行。