1

我有一个我正在尝试用 Javascript 读取的表,其中的数据足够大,我希望以二进制格式保存它以节省空间。该表的大部分内容不是数字就是枚举,但也有一些数据是字符串。我正在尝试找出用 Javascript 读取该数据的最佳方法。有什么建议么?

仅供参考,压缩后的文本版本约为 33 MB,而压缩后的二进制文件约为 20 MB,这就是我尝试减小大小的原因,希望能够更快地加载。我打算用 Python 对数据进行一些预处理,这会将数据减少到我真正关心的数据。我可能正在对这些数据进行一些过滤,但理想情况下我最终想要一个静态网站,所以我强烈希望不必依赖任何类型的服务器端代码。几乎有任何值得注意的文件只有约 1 MB,所以我希望这不是一个大问题。

如果任何系统允许 16 位浮点数,则加分,因为有许多浮点数,16 位的精度足以充分捕获。

到目前为止,我的代码很简单,如下所示。请注意发生任何有用的事情的缺失块......

function loadBinaryFloatArray(url) {
    
    var mRequest = new XMLHttpRequest();
    mRequest.open('GET', url);
    mRequest.responseType = 'arraybuffer';

    mRequest.onreadystatechange = function () {
        if (this.readyState === 4) {


        }
    };
    mRequest.send();
}

console.log("Test")

loadBinaryFloatArray("/data/sbdb_important.bin")

数据看起来像这样。注意我可能会删除其中的一些列,但这是源数据。在某些引用中,实际上只有第一列将存储为字符串,其他列可以存储为某种类型的数字或转换为数字的枚举。可能会有两个实际的字符串,我想我要把一根字符串分成两部分。

在此处输入图像描述

作为参考,打包的 Python 代码如下。如果需要,我可以将es 更改为其他值,float32s 或转换为小数的整数,但如果能原生支持会很好。

struct.pack('ehifeefff',diameter,type,epoch,a,e,i,om,w,ma)
4

1 回答 1

1

这类问题通常需要定制解决方案,并且涉及很多调整。但是,一般来说,我认为它可以是这样的:

将数据拆分为列类型。通过单独的、按类型但同时的请求检索数据。字符串列将只是字符串数组的 JSON 数组,http 压缩将负责最小化下载大小。浮点数和整数可以作为适当类型的二进制数组发送(请参阅Javascript 类型数组)。枚举可以是字符串(http 压缩可以使下载速度更快)或整数加映射,测试会知道哪个通常更快。

在浏览器中,重新组合数据。该表看起来很大,因此您可能需要一个表分页库来处理演示。否则,请使用有效的策略来插入大量元素。这通常是通过创建一个代表最终 html 的大量文本块数组.join(''),然后将其全部注入到文档中。

于 2021-12-06T01:19:19.870 回答