You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 17:06:03