优化了将大整数数组从javascript传输到flask和viceversa的方法

优化了将大整数数组从javascript传输到flask和viceversa的方法,javascript,python,arrays,flask,Javascript,Python,Arrays,Flask,我想把一个大uint8一维数组的字典(2个数组,每个数组大约1'000'000个元素)从javascript传递到flask和viceversa。我知道如何通过fetch和json stringify(见下面的代码)进行传输,但我认为可能有一个更好的解决方案,它需要更少的带宽和更高的性能。我只需要传输无符号整数,而不是任何字符串。我还使用它来减少要传输的数据量 到目前为止,我的代码是: backend.py带烧瓶 import json import flask import numpy as

我想把一个大uint8一维数组的字典(2个数组,每个数组大约1'000'000个元素)从javascript传递到flask和viceversa。我知道如何通过fetch和json stringify(见下面的代码)进行传输,但我认为可能有一个更好的解决方案,它需要更少的带宽和更高的性能。我只需要传输无符号整数,而不是任何字符串。我还使用它来减少要传输的数据量

到目前为止,我的代码是:

backend.py带烧瓶

import json
import flask
import numpy as np
from flask_compress import Compress

app = flask.Flask(__name__)
Compress(app)

@app.route('/save_mask', methods=['POST'])
def save_mask():
    data = json.loads(flask.request.data)
    mask = np.array(data['mask'])
    ...
frontend.html和javascript

fetch("/save_mask", {
        method: "POST",
        body: JSON.stringify({
            'mask': mask,
            'pixels': pixels
        })
    })

不使用json传输裸uint8数组的最佳方法是什么?

因为这是uint8数组,所以可以使用for循环将其转换为“字节字符串”,在JS端,还可以使用for和将其从“字节字符串”还原

当然,您也可以使用gzip或etc压缩该字符串,但不确定是否有可用的JS库等等

python将ints数组作为base64编码字符串发送的服务器端示例
在这个示例中,正如您所看到的,我们“将我们的ints数组打包为一个base64编码字节字符串”
exclhzn7chddmwwwpag=\\n
,对于相同的ints列表
[123,23,11,31,51,123,112,112,221,51,12,41,2]
对不起,我不明白。为什么在传输整数之前将其转换为字节字符串更好?因为字节字符串将使用1字节/1 uint8整数,而不是1-3(加上逗号/int作为分隔符),所以没有选项仅从整数传递纯字节吗?我基本上想要绕过json.stringify.no,因为json是对象的字符串表示,它不适用于任何二进制数据。您应该将ints数组转换为某种字符串(并在客户端重新转换)。让我添加一个python服务器端转换的示例
>>> import base64, json, array
>>> source = [123, 23, 11, 31, 51, 123, 112, 112, 221, 51, 12, 41, 2]
>>> json.dumps({'values': source})
'{"values": [123, 23, 11, 31, 51, 123, 112, 112, 221, 51, 12, 41, 2]}'
>>> len(json.dumps({'values': source}))
68
>>> json.dumps({'values': base64.encodestring(array.array('B', source).tostring()).decode('ascii')})
'{"values": "excLHzN7cHDdMwwpAg==\\n"}'
>>> len(json.dumps({'values': base64.encodestring(array.array('B', source).tostring()).decode('ascii')}))
36