如何使用烧瓶发送和接收大型 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 绑定应用程序

一种解决方案是异步处理请求。意思是:

  1. 服务器收到请求,returns 202 ACCEPTED 和 link 到客户端可以检查矩阵创建进度的地方

  2. 客户端检查返回的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)