python - 使用Flask保存并发送大型numpy数组

我正在寻找通过Flask发送大型Numpy数组(主要由图像组成)的最佳方法。

现在,我正在做这样的事情:

服务器端:

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


客户端:

with open('test_temp', 'wb') as f:
    f.write(r.content)
my_array = np.load('test_temp')


但是.npy文件很大,因此花费的时间太长。

我曾考虑过使用h5py,但是由于图像的大小不同(array.shape = (200,)),因此我无法使用h5py(为每个图像创建数据集将太长)。

有谁知道如何优化它?

最佳答案

由于评论部分实际上才刚刚开始成为一个答案,因此我将在此处全部写下。

编辑:numpy具有将多个数组压缩到一个文件中的内置方法,以将它们整齐地打包起来以便发送。结合使用缓冲区而不是磁盘上的文件,这可能是提高速度的最快,最简单的方法。这是numpy.savez_compressed将一些数据保存到缓冲区的快速示例,并且this question显示了使用flask.send_file发送缓冲区

import numpy as np
import io

myarray_1 = np.arange(10) #dummy data
myarray_2 = np.eye(5)

buf = io.BytesIO() #create our buffer
#pass the buffer as you would an open file object
np.savez_compressed(buf, myarray_1, myarray_2, #etc...
         )

buf.seek(0) #This simulates closing the file and re-opening it.
            #  Otherwise the cursor will already be at the end of the
            #  file when flask tries to read the contents, and it will
            #  think the file is empty.

#flask.sendfile(buf)

#client receives buf
npzfile = np.load(buf)
print(npzfile['arr_0']) #default names are given unless you use keywords to name your arrays
print(npzfile['arr_1']) #  such as: np.savez(buf, x = myarray_1, y = myarray_2 ... (see the docs)


有3种快速方法可以加快文件发送速度。


不要写到磁盘:这很简单,只需在将数据传递给flask.send_file()之前使用缓冲区存储数据
压缩数据:一旦有了二进制数据的缓冲区,就有许多压缩选项,但是zlib是标准python发行版的一部分。如果您的数组是图像(甚至不是图像),则png compression是无损的,有时可以提供比zlib更好的压缩效果。 Scipy正在对其内置的imreadimwrite进行折旧,因此您现在应该使用imageio.imwrite
获取性能更高的服务器以实际执行文件发送。当您调用app.run()或直接通过flask($flask run$python -m flask run)调用应用程序时被调用的内置开发服务器不支持X-Sendfile功能。这是在烧瓶之类的Apache或Nginx之后运行flask的原因之一。不幸的是,对于每台服务器而言,实现方式并不相同,并且可能需要在文件系统中使用一个文件(尽管如果操作系统支持,您可以使用内存中的文件)。无论您选择哪种部署,这都是rtfm的情况。

本文翻译自 https://stackoverflow.com/questions/55301037/

网站遵循 CC BY-SA 4.0 协议,转载或引用请注明出处。

标签 python numpy flask h5py


相关文章:

python - 从本地客户端计算机向Ubuntu服务器上的Flask服务器发送和接收数据

python - 如何使用Flask HTTP Auth为Web服务实现“用户名/密码错误”提示?

python - 用python交叉编译gdb for arm失败了

python - Python多处理性能

python - 从字符串创建元组(x,y)列表[重复]

python - 如何实现numpy.cov()函数?

python - ModuleNotFoundError:没有名为“ MySQLdb”的模块

python - Django:AttributeError:'NoneType'对象没有属性'split'

python - 在pandas中交换/排序多索引列

python - 对二维numpy数组中的每一行应用相同的排列