我正在开发一个项目,在那里我获得了一个可以在分布式系统中运行的Java矩阵乘法程序,该程序运行如下:
usage: java Coordinator maxtrix-dim number-nodes coordinator-port-num
例如:
java blockMatrixMultiplication.Coordinator 25 25 54545
以下是输出结果的快照:
我想用某种故障安全功能扩展这段代码 - 我很好奇如何在运行的矩阵乘法计算中创建检查点。一般的想法是恢复到计算中的位置(但它不需要如此细粒度 - 只是恢复到开始,即row 0 column 0
)
我的第一个想法是使用日志文件(如Apache log4j),我将记录相关的矩阵状态。然后,如果我们在计算过程中强行关闭应用程序,我们就可以恢复到合理的检查点。
我应该将MySQL用于这样的任务(或者更轻量级的数据库)吗?或者一个基本的日志文件(并使用一些有用的Apache库)是否足够好?感谢任何提示,谢谢
源代码:
答案 0 :(得分:3)
如果我正确理解了问题,您只需要在发生崩溃时或在应用程序中途退出的情况下,在单个矩阵计算中恢复您的位置。
最简单的方法是只恢复您主动乘以的两个矩阵,但不是你的进度,并在下次加载应用程序时从头开始乘以它们。
过程:
public static int[][] multiplyMatrix(int[][] a, int[][] b)
类的MatrixMultiple
开头,创建一个文件,让它调用recovery_data.txt
,两个数组的状态相乘(参数{{ 1}}和a
)。或者,您可以使用一个简单的数据库。b
课程的public static int[][] multiplyMatrix(int[][] a, int[][] b)
末尾,在您返回之前,请清除该文件的内容,或者擦除您的数据库。MatrixMultiple
的开头,你应检查文本文件的内容是否为非空,在这种情况下你应该乘以文件的内容,并显示输出,否则照常进行。实施说明:
您表示有兴趣通过利用上次程序运行时已经处理过一些计算的可能性来保存一些计算。让我们先来看看在处理完每一行后添加检查点的优点和缺点,我最好能看到它们。
优点:
缺点:
我并不是说检查站肯定不是更好的解决方案,只是因为我不知道它们是否值得,但这是我会考虑的:
因此,如果您预计会发生相对大量的实例,并且需要相对较长的时间来完成计算,我只会建议像这样的检查点。
如果您决定使用检查点,请将方法修改为:
在您为数据库生成该行内容的数组上处理每一行之后,或者如果您使用纺织品,在纺织品的末尾,在另一条空行之后将其与最后一个矩阵。
启动时如果您需要完成已经开始的计算,只解析并分发尚未考虑的行,并从数据库中检索其他行的内容。
实施频繁检查点的快速点:通过将此任务推送到其他线程,可以大大减少添加频繁检查点所带来的额外延迟。这样做会使用更多进程,并且实际产生进程或线程总会有一些延迟,但是您不必等待整个写操作在继续之前完成。
如果存在未经检查的边缘情况,这意味着某种无效矩阵会使程序崩溃,这个故障保护现在通过在每次启动时再次尝试来完全阻止程序。为了解决这个问题,我看到了一些明显的解决方案,但也许有些想法可以让你修改我喜欢的方法:
我希望这为您提供了足够的信息,以最合理的方式实现您的故障保护,考虑到您怀疑的实际用途,并注意到也许还有其他方法可以解决这个问题,这些可以同样有自己的利弊列表。