【问题标题】:How to send and receive large numpy arrays (several GBs) using flask如何使用烧瓶发送和接收大型 numpy 数组(几 GB)
【发布时间】:2017-02-28 16:01:58
【问题描述】:

我正在创建一个在本地使用的微服务。从一些输入我每次生成一个大矩阵。现在我正在使用 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())

如何发送大型矩阵?

【问题讨论】:

  • 以二进制形式发送数据怎么样?
  • 知道我该怎么做吗?如何将我的矩阵转换为二进制以及如何在另一端正确接收它?
  • 可以查看pythonarray模块或者numpy。这是一个与之相关的问题stackoverflow.com/questions/751055/binary-array-in-python

标签: json python-3.x flask python-requests protocol-buffers


【解决方案1】:

我想问题是矩阵需要时间来生成。这是一个 CPU 密集型应用程序

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

  1. 服务器收到请求并返回 202 ACCEPTED 以及客户端可以检查矩阵创建进度的链接

  2. 客户端检查他获得的返回 url:

    • 如果矩阵尚未创建,则返回 200 OK 响应
    • 如果最终创建了矩阵,则返回 201 CREATED 响应,并带有指向资源的链接

但是,Flask 一次处理一个请求。所以你需要使用多线程或多处理或greenthreads。

【讨论】:

    【解决方案2】:

    最后我用了

    np.save(matrix_path, mat)
    return send_file(matrix_path+'.npy') 
    

    在客户端,我在加载之前保存矩阵。

    【讨论】:

      【解决方案3】:

      在客户端,您可以执行以下操作:

       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)
      

      【讨论】:

        猜你喜欢
        • 2014-07-16
        • 2018-12-21
        • 1970-01-01
        • 1970-01-01
        • 2022-09-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多