求助: Python flask 应用内存一直在增加

查看 24|回复 0
作者:davinci21s   
2 个版本,都没有解决内存持续增加,由于内存一直增加,最后因为小鸡内存不足而被杀掉。
这是一个加载训练后的模型,通过网络传入预测参数,然后返回预测 json 结果。
可能同时发起(并发)几十个请求。
求大佬帮忙看看问题出在哪里,谢谢。
这是 chatgpt 4.0 给的版本
from flask import Flask, request, jsonify
import pickle
import os
import psutil
import pandas as pd
app = Flask(__name__)
class SingletonModel:
    _instance = None
    def __new__(cls):
        if cls._instance is None:
            print("Creating Singleton Instance")
            cls._instance = super(SingletonModel, cls).__new__(cls)
            modelName = "xgboost_model-k.pkl"
            with open(modelName, "rb") as pkl_file:
                loaded_data = pickle.load(pkl_file)
            cls._instance.model = loaded_data['model']
            cls._instance.scaler = loaded_data['scaler']
            cls._instance.label_encoder = loaded_data['label_encoder']
            cls._instance.feature_names = ['shortAvg','longAvg','volatility','diff']
        return cls._instance
resources = SingletonModel()
model = resources.model
scaler = resources.scaler
label_encoder = resources.label_encoder
@app.route('/predict', methods=['POST'])
def predict():
    global model, scaler, label_encoder
    data = request.json['input']
    df = pd.DataFrame([data], columns=resources.feature_names)
    scaled_data = scaler.transform(df)
    prediction = model.predict(scaled_data)
    label_prediction = label_encoder.inverse_transform(prediction)
    return jsonify([label_prediction[0]])
if __name__ == '__main__':
    app.run(port=6601,debug=True)
这是 Claude 给的版本
import asyncio
from flask import Flask, request, jsonify
import pickle
import pandas as pd
app = Flask(__name__)
# 模型相关全局变量
model = None
scaler = None
label_encoder = None
async def load_model():
  global model, scaler, label_encoder,feature_names
  if not model:
    with open('xgboost_model-k.pkl', 'rb') as f:
      loaded_data = pickle.load(f)
      model = loaded_data['model']
      scaler = loaded_data['scaler']
      label_encoder = loaded_data['label_encoder']
      feature_names = ['shortAvg','longAvg','volatility','diff']
async def predict(data):
  await load_model()
  df = pd.DataFrame([data], columns=feature_names)
  scaled_data = scaler.transform(df)
  prediction = model.predict(scaled_data)
  label_prediction = label_encoder.inverse_transform(prediction)
  return label_prediction[0]
@app.route('/predict', methods=['POST'])
async def predict_handler():
  data = request.json['input']
  result = await asyncio.gather(predict(data))
  return jsonify(result)
if __name__ == '__main__':
    app.run(port=6601,debug=False)
您需要登录后才可以回帖 登录 | 立即注册

返回顶部