Python Flask未在Centos7中释放内存
我创建了一个简单的Python Flask未在Centos7中释放内存,python,flask,memory-leaks,centos7,joblib,Python,Flask,Memory Leaks,Centos7,Joblib,我创建了一个简单的flask方法,该方法使用joblib从磁盘加载和卸载字典对象(包含LogisticRegression和tfidfvectorier使用sklearn)。以下是函数: def load_unload_model(): a_model_path = 'model.bin' print('Memory before loading model:', get_memory_usage()) model_obj = joblib.load(a_model_pa
flask
方法,该方法使用joblib
从磁盘加载和卸载字典对象(包含LogisticRegression
和tfidfvectorier
使用sklearn
)。以下是函数:
def load_unload_model():
a_model_path = 'model.bin'
print('Memory before loading model:', get_memory_usage())
model_obj = joblib.load(a_model_path)
print('Memory after loading model:', get_memory_usage())
del model_obj
gc.collect()
print('Memory after unloading model:', get_memory_usage())
当我使用Flask
方法迭代调用此函数时,进程的内存会随着每个请求不断增加。如果我从Main
运行相同的函数,则加载前和卸载后的内存模型保持不变。Windows上不会出现此问题
以下是完整的代码:-
import os, gc, psutil, sys
from flask import Flask
import joblib
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
app = Flask(__name__)
global_request_counter = 0
def get_memory_usage():
a_process = psutil.Process(os.getpid())
return str(round(a_process.memory_info().rss/(1000*1000))) + 'MB'
def load_unload_model():
a_model_path = 'model.bin'
a_model_path2 = 'model2.bin'
print('Memory before loading model:', get_memory_usage())
model_obj = joblib.load(a_model_path)
model_obj2 = joblib.load(a_model_path2)
print('Memory after loading model:', get_memory_usage())
del model_obj
del model_obj2
gc.collect()
print('Memory after unloading model:', get_memory_usage())
@app.route('/prediction_service/load_model', methods=['GET'])
def load_model_api():
global global_request_counter
print('Request:', global_request_counter+1, 'Started')
load_unload_model()
print('Request:', global_request_counter+1, 'Ended')
print('-'*50)
global_request_counter += 1
return "Execution Successful"
if __name__ == "__main__":
run_flask = 1
if run_flask == 1:
app.run(host="0.0.0.0", port="8060")
else:
for i in range(15):
print('Iteration:', i+1, 'Started')
load_unload_model()
print('Iteration:', i+1, 'Completed')
print('-'*50)
以下是Centos7上使用烧瓶的输出:
请求:1已启动加载前内存型号:71MB
加载后的内存型号:134MB
卸载后的内存型号:83MB
请求:1结束
请求:2个已启动
加载前内存型号:84MB
加载后的内存型号:152MB
卸载后的内存型号:87MB
请求:2个结束
请求:3个已启动
加载前内存型号:85MB
加载后的内存型号:152MB
卸载后的内存型号:89MB
请求:3个结束
..
..
..
请求:14个已启动
加载前内存型号:94MB
加载后的内存型号:157MB
卸载后的内存型号:102MB
请求:14结束
请求:15个已启动
加载前内存型号:102MB
加载后的内存型号:157MB
卸载后的内存型号:102MB
请求:15结束