Python运行邻接矩阵计算任务时如何暂停脚本并保存已生成的输出
问题结论
你当前正在运行的脚本无法实现暂停同时导出已生成数组的需求:所有已计算的output_long内容都存储在Python进程的独立内存空间中,没有对外的读取接口,如果强制终止进程,所有已计算的内容会直接丢失。
如果当前任务已经运行了很长时间,你不想丢失已有数据,只能等待当前卡住的bet.Betti_k调用执行完成,脚本跑完所有循环后会自动保存结果;如果确认该调用已经彻底无响应,只能放弃本次运行结果,修改脚本后重新运行。
脚本优化方案(后续运行可支持暂停存数据)
修改后的脚本可以加入中断信号捕获、定时自动存盘逻辑,下次运行时随时按Ctrl+C暂停,都会自动保存当前已计算的内容,修改后代码如下:
import scipy.io import numpy as np import scipy.spatial import signal # 注册中断信号处理逻辑 def save_and_exit(signum, frame): print("检测到中断指令,正在保存当前计算结果...") scipy.io.savemat('longout_temp.mat', {'output_long': output_long}) print("结果已保存至 longout_temp.mat,程序退出") exit(0) signal.signal(signal.SIGINT, save_and_exit) # 原有初始化逻辑 longmat = scipy.io.loadmat('longmat.mat') longmat = longmat['longmat'] matlength = longmat.shape densval = np.arange(0, 1, 0.01) betti = 0 output_long = np.zeros((264, 168, 12), dtype=float, order='F') for z in range(matlength[2]): for s in range(matlength[1]): temp = longmat[:, s, z] tempr = scipy.spatial.distance.squareform(temp, checks=True) for dens in range(len(densval)): G_tda = gd.graph_density(densval[dens], tempr) B = bet.Betti_k(G_tda, betti, verbose=False) output_long[dens, s, z] = B if B < 2: break # 可选:每完成一组z维度的计算就自动存盘一次,最大程度降低数据丢失风险 scipy.io.savemat('longout_temp.mat', {'output_long': output_long}) # 全部计算完成后保存最终结果 scipy.io.savemat('longout.mat', {'output_long': output_long})
额外优化建议
- 可以给
bet.Betti_k调用增加超时逻辑,避免单个异常矩阵卡死整个任务,可通过func-timeout等第三方库快速实现 - 正式批量计算前可以先抽样测试所有矩阵的计算耗时,提前筛选出可能存在异常的矩阵
内容的提问来源于stack exchange,提问作者Georgette Argiris
相关产品推荐
相关产品推荐

