MPJ:封装对象(序列化)

时间:2014-05-28 11:23:58

标签: java serialization mpi

这是上下文,我正在修改一个演化算法以利用实验室的集群。所以我需要通过网络发送我们的“个人”进行评估并让他们回来。

个人看起来像:

public class Individual_Multi extends Individual implements java.io.Serializable, Clonable
{
    private static final long serialVersionUID = 1L;
    boolean looged, evaluated;
    protected double[][] matrix = new double[9][9];
    protected ArrayList<Reaction> _reactions = new ArraList<Reaction>();

    ... methodes ...
}

反应是:

public class Reaction implements java.io.Serializable, Clonable
{
    private static final long serialVersionUID = 1L;
    protected int leftEnzymeId;
    //5 more
    protected double k_plus;
    //1 more
}

(请记住,每个人的反应数量不固定!)

我的主要:

Individual[] P_total = null;
Individual[] P_local = new Individual[n];
if(rank == 0)
{
    P_total = new Individual[n*nproc];
    initialize(P_total); //Populate the array
}

for(int generation = 0 ; generation < 1000 ; generation ++ )
{
   MPI.COM_WOLRD.Scatter(P_total, 0, n, MPI.OBJECT, P_local, 0, n, MPI.OBJECT, 0);

   for(Individual p : P_local)
      p.evaluate();   <--- Error here
   ...
}

评估读取个人的内部并将其发送到另一个班级。

编辑:出现空指针异常的方法

public void evaluate()
{
    if (evaluated == true)
        return;
    try 
    {
        _fitness[0] = odesimulation.OdeImplicitSolver_Nicolas.getFitnessValue_2( this.getDescription() );
    }

    _fitness[1] = this._reactions.size();
    evaluated = true;
}

getDescription()只是一个在所有内部调用toString()的方法,并返回连接版本。

java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at runtime.starter.MulticoreStarter$1.run(MulticoreStarter.java:277)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.NullPointerException
    at Individual_Multi.evaluate(Individual_Multi.java:752)
    at Evolver.run(Evolver.java:198)
    at Evolver.main(Evolver.java:524)
    ... 6 more

(顺便说一句,如何打印堆栈的其余部分?)

当我尝试使用最少的示例时,它适用于类,但不再像这里那样使用封装。我猜这是问题所在,但对于Java来说是新手,我对解决方法没有任何线索。

作为一个懒惰的实习生,自动序列化是首选方式,但假设我们可以查明问题,我希望自己编写序列化方法。

提前谢谢你,祝你有愉快的一天! 马克。

EDIT2: 我试着用一个更简单的例子来试验:

public class DummyNestedTest implements java.io.Serializable
{
    private int tab;
    public DummyNestedTest(int n)
    {
        tab = n;
    }

    public void print()
    {
        System.out.println(tab);
    }
}

顶级课程

public class DummyTest implements java.io.Serializable
{
    private int[] tab;
    private ArrayList<Float> array;
    private DummyNestedTest nested;

    public DummyTest(int n)
    {
        DummyNestedTest nested = new DummyNestedTest(n); 
        tab = new int[8];
        array = new ArrayList<Float>(8);
        for(int i = 0 ; i < tab.length ; i++)
        {
            tab[i] = n;
            array.add((Float)2.f*n);
        }
    }

    public void print()
    {
        System.out.println(array.toString());
        System.out.println(tab[0]);
        nested.print();
    }
}

主要:

public class MpjTest
{
    public static void main(String[] argv)
    {
        MPI.Init(argv);

        int rk = MPI.COMM_WORLD.Rank();
        int np = MPI.COMM_WORLD.Size();
        int n = 20;

        DummyTest[] P = null;
        DummyTest[] Pt = new DummyTest[n/np];
        for(int i = 0 ; i < Pt.length ; i ++)
            Pt[i] = new DummyTest(rk);

        if(rk == 0)
            P = new DummyTest[n];

        MPI.COMM_WORLD.Gather(Pt,0,n/np,MPI.OBJECT,P,0,n/np,MPI.OBJECT,0);

        if(rk == 0)
           for(DummyTest t : P)
            t.print();

        MPI.Finalize();

     }
 }

给出

[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
0
java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at runtime.starter.MulticoreStarter$1.run(MulticoreStarter.java:277)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.NullPointerException
    at DummyTest.print(DummyTest.java:25)
    at MpjTest.main(MpjTest.java:33)
    ... 6 more

1 个答案:

答案 0 :(得分:0)

看到藏红花的答案!

  

您好,您的示例中的错误来自:DummyNestedTest nested = new DummyNestedTest(n);您在此处创建了另一个引用,而不是初始化您的私有DummyNestedTest嵌套字段。相反,你需要这样做:this.nested = new DummyNestedTest(n);当您尝试调用nested.print()时,该字段未初始化的事实引发了错误。 - 藏红花