如何使用烧瓶发送和接收大型 numpy 数组(几 GB)
How to send and receive large numpy arrays (several GBs) using flask
我正在创建一个在本地使用的微服务。根据一些输入,我每次都生成一个大矩阵。现在我正在使用 json 来传输数据,但它真的很慢并且成为我应用程序的瓶颈。
这是我的客户端:
headers={'Content-Type': 'application/json'}
data = {'model': 'model_4', \
'input': "this is my input."}
r = requests.post("http://10.0.1.6:3000/api/getFeatureMatrix", headers=headers, data=json.dumps(data))
answer = json.loads(r.text)
我的服务器是这样的:
app = Flask(__name__, static_url_path='', static_folder='public')
@app.route('/api/getFeatureMatrix', methods = ['POST'])
def get_feature_matrix():
arguments = request.get_json()
#processing ... generating matrix
return jsonify(matrix=matrix.tolist())
如何发送大矩阵?
我想问题是矩阵需要时间来生成。这是一个 CPU 绑定应用程序
一种解决方案是异步处理请求。意思是:
服务器收到请求,returns 202 ACCEPTED 和 link 到客户端可以检查矩阵创建进度的地方
客户端检查返回的url他要么得到:
- 如果尚未创建矩阵,则返回 200 OK 响应
- 如果最终创建了矩阵,则为 201 CREATED 响应,并且 link 到资源
但是,Flask 一次处理一个请求。所以你需要使用多线程或多处理或 greenthreads。
最后我用了
np.save(matrix_path, mat)
return send_file(matrix_path+'.npy')
在客户端,我在加载之前保存矩阵。
在客户端你可以这样做:
with open('binariy.file', 'rb') as f:
file = f.read()
response = requests.post('/endpoint', data=file)
在服务器端:
import numpy as np
...
@app.route('/endpoint', methods=['POST'])
def endpoint():
filestr = request.data
file = np.fromstring(filestr)
我正在创建一个在本地使用的微服务。根据一些输入,我每次都生成一个大矩阵。现在我正在使用 json 来传输数据,但它真的很慢并且成为我应用程序的瓶颈。
这是我的客户端:
headers={'Content-Type': 'application/json'}
data = {'model': 'model_4', \
'input': "this is my input."}
r = requests.post("http://10.0.1.6:3000/api/getFeatureMatrix", headers=headers, data=json.dumps(data))
answer = json.loads(r.text)
我的服务器是这样的:
app = Flask(__name__, static_url_path='', static_folder='public')
@app.route('/api/getFeatureMatrix', methods = ['POST'])
def get_feature_matrix():
arguments = request.get_json()
#processing ... generating matrix
return jsonify(matrix=matrix.tolist())
如何发送大矩阵?
我想问题是矩阵需要时间来生成。这是一个 CPU 绑定应用程序
一种解决方案是异步处理请求。意思是:
服务器收到请求,returns 202 ACCEPTED 和 link 到客户端可以检查矩阵创建进度的地方
客户端检查返回的url他要么得到:
- 如果尚未创建矩阵,则返回 200 OK 响应
- 如果最终创建了矩阵,则为 201 CREATED 响应,并且 link 到资源
但是,Flask 一次处理一个请求。所以你需要使用多线程或多处理或 greenthreads。
最后我用了
np.save(matrix_path, mat)
return send_file(matrix_path+'.npy')
在客户端,我在加载之前保存矩阵。
在客户端你可以这样做:
with open('binariy.file', 'rb') as f:
file = f.read()
response = requests.post('/endpoint', data=file)
在服务器端:
import numpy as np
...
@app.route('/endpoint', methods=['POST'])
def endpoint():
filestr = request.data
file = np.fromstring(filestr)