我正在尝试使用open-mpi中的java绑定将某些计算的结果直接写入文件。我知道这听起来并不是很好的表现,但是在我看来,当我没有设法完成我的时候,这似乎是最简单(也是最可靠)的方式。计算。
我写入该文件的代码如下所示:
private Iterator<Object> writeAndCalculate(Iterator<Object> it) {
int mode = MPI.MODE_WRONLY | MPI.MODE_CREATE | MPI.MODE_APPEND;
try(mpi.File file = new mpi.File(MPI.COMM_WORLD, getFileName(), mode)) {
Code code;
long result;
int counter = 0;
while(it.hasNext()) {
Object o = it.next();
if(counter++ == myRank) {
//computations...
byte[] buf = serialize(new Pair<Code, Long>(code, result);
file.writeShared(buf, buf.length, MPI.BYTE);
}
if(counter == nrOfProcessors)
counter = 0;
}
it.remove();
} catch (MPIException mpie) {
mpie.printStackTrace();
}
return it;
}
serialize(Serializable)
的样子:
private byte[] serialize(Serializable object) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try(ObjectOutputStream oos = new ObjectOutputStream(baos)) {
oos.writeObject(object);
}
catch (IOException ioe) {
ioe.printStackTrace();
}
return baos.toByteArray();
}
我还有一些反序列化的代码:
private Object deserialize(byte[] buf) throws ClassCastException {
ByteArrayInputStream bis = new ByteArrayInputStream(buf);
try(ObjectInputStream ois = new ObjectInputStream(bis)) {
return ois.readObject();
} catch (IOException ioe) {
ioe.printStackTrace();
} catch (ClassNotFoundException cnfe) {
cnfe.printStackTrace();
}
return null;
}
当我想再次阅读对象时会出现问题,因为我无法找到如何反序列化文件中的所有对象。我试图找到类似的东西:
private SortedMap<Code, Long> read() {
SortedMap<Code, Long> result = new TreeMap<>();
try(mpi.File file = new mpi.File(MPI.COMM_WORLD, getFileName(), MPI.MODE_RDONLY)) {
byte[] buf = new byte[(int) file.getSize()];
file.readAll(buf, buf.length, MPI.BYTE);
while(/*part of buf not read*/) {
Pair<Code, Long> pair = deserialize(buf);
result.merge(pair.getKey(), pair.getValue(), (v1, v2) -> v1 + v2);
}
} catch (MPIException e) {
e.printStackTrace();
}
return result;
}
但我不知道如何找出我的缓冲区的哪个部分已被读取以及哪个部分仍然包含对象。我有一个想法让deserialize(byte[])
覆盖已读取的值,但我不知道如何做这样的事情。
因为我已经花了好几个小时,所以我非常绝望,我很感激任何帮助让我看到光明。如果有人可以建议更好的方法同时从多个处理器将所有内容写入一个文件,请随时留下建议。
我很抱歉这是一个很长的问题,但我只需要一些方法来存储({1}}这是并发计算的结果(部分)。这应该以这样的方式完成:当计算被取消或中断时,我可以从点计算开始停止。