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

运行SARIMAX时序预测代码出现MemoryError,寻求解决方案

解决SARIMAX循环预测中的MemoryError问题

问题根源

你当前的代码在每次循环中都基于不断增长的history重新初始化并训练SARIMAX模型。随着循环次数增加,history的长度持续变大,Statsmodels的SARIMAX在构建状态空间模型时需要分配的数组规模(如报错中的(51, 51, 40169))也会线性增长,最终导致内存耗尽。

解决方案

  • 使用SARIMAX的在线更新能力(最优方案)
    不需要每次从头训练模型,Statsmodels的SARIMAX拟合结果支持通过append方法更新历史数据,复用已有模型参数,避免重复分配大内存数组:

    # 初始训练一次模型
    model = SARIMAX(train_series, order=(1,1,1), seasonal_order=(1,1,1,24), 
                    enforce_stationarity=False, enforce_invertibility=False)
    model_fit = model.fit()
    
    sarima_preds = []
    
    for t in range(len(test_series)):
        # 直接预测下一个值
        output = model_fit.forecast()
        sarima_preds.append(output[0])
        # 更新模型历史数据,不重新训练
        model_fit = model_fit.append(test_series[t], refit=False)
    
    sarima_pred_series = pd.Series(sarima_preds, index=test_series.index)
    

    这里的核心是refit=False,它会跳过重新拟合步骤,仅更新状态空间的历史信息,内存占用会保持稳定。

  • 降低数据精度
    将数据从float64转为float32,直接减少一半内存占用,适用于对精度要求不高的场景:

    train_series = train_series.astype('float32')
    test_series = test_series.astype('float32')
    
  • 限制训练历史长度
    如果业务场景允许丢弃早期历史数据,可以在循环中固定history的最大长度,避免数据集无限增长:

    sarima_preds = []
    history = [x for x in train_series]
    max_history_len = 1000  # 根据实际情况调整
    
    for t in range(len(test_series)):
        model = SARIMAX(history, order=(1,1,1), seasonal_order=(1,1,1,24), 
                        enforce_stationarity=False, enforce_invertibility=False)
        model_fit = model.fit()
        output = model_fit.forecast()
        sarima_preds.append(output[0])
        
        history.append(test_series[t])
        # 截断历史数据,保持固定长度
        if len(history) > max_history_len:
            history = history[-max_history_len:]
    
    sarima_pred_series = pd.Series(sarima_preds, index=test_series.index)
    

内容的提问来源于stack exchange,提问作者Sonu Kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 15:00:17