为JavaScript客户端编码/解码大量数据的最佳方式

Best way to encode/decode large quantities of data for a JavaScript client?

本文关键字:数据 最佳 方式 解码 JavaScript 客户端 编码      更新时间:2023-09-26

我正在用Spine、Node.js等编写一个独立的javascript应用程序(如果你感兴趣,这里是它的早期版本)。基本上,该应用程序是一个交互式的"数字属性"资源管理器。这个想法是,你可以选择任何数字,看看它具有什么性质。它是素数,还是三角形等?共享相同属性的其他数字在哪里?诸如此类的事情。

目前,我可以很容易地显示数字1-10k,但我想显示数字100万,甚至更好的是10亿的属性。

我希望我的客户端下载一组静态数据文件,然后使用它们将信息呈现给用户。我不想写一个服务器后端。

目前我使用JSON作为数据文件。对于一些数据,我知道一个简单的算法来导出我在客户端寻找的信息,我会使用它(即,它是偶数吗?)。对于较难的数字,我预先计算它们,然后将值存储在JSON可解析的数据文件中。我对整件事有点过分了——我实现了一个纯javascript bloom过滤器,当它不能扩展到100万素数时,我尝试在下面使用CONISE位图(这没有帮助)。最终,我意识到,如果我将数据表示为JSON,那么如何"压缩"我的数据并不重要。

所以问题是,我想为每个数字显示30个属性,我想显示一百万个数字。。。这相当于3000万个数据点。我希望javascript应用程序下载这些数据并将其呈现给用户,但我不希望用户必须下载兆字节的信息才能使用该应用程序。。。

我有哪些选项可以有效地将这些大数据集发送到我的仅限javascript的解决方案?

我可以转换为二进制文件,然后在客户端读取二进制文件吗?请举例说明!

在客户端上计算这些数据点如何?

你会省去很多头疼的事。您可以预先计算索引图,并只在用户选择特定数字时才处理其余数据点。

对于每个数字所表现出的特性。现代桌面上的纯JavaScript速度快得惊人(如果你远离DOM),我想你会发现算法和预先计算的JSON解决方案之间的处理速度差异可以忽略不计,你会省去很多痛苦和不必要的带宽使用。

对于初始索引图,它只显示每个数字的属性数量,并且可以作为数组传输:

'[18,12,9,11,9,7,8,2,6,1,4, ...]'

或JSON:

{"i": [18,12,9,11,9,7,8,2,6,1,4, ...]}

请注意,这对对数刻度也是一样的,因为无论哪种方式,您都只能在任何时候将值附加到屏幕中的1点。您只需要相应地满足数组的内容(通过在1-2K大小的数组上顺序返回对数值)。

你甚至可以使用DEFLATE算法对其进行进一步压缩,但由于你只能在屏幕上显示有限的数字(桌面上的像素数<1-2K),我建议你围绕这一事实创建解决方案,例如,检查你是否可以在移动中以最小的影响计算2K*30=60K属性,这可能比现在要求服务器给你一些JSON更快。

2012年1月10日更新

我刚刚看到你关于用户可以点击特定属性并获得显示该属性的数字列表的评论。

我认为上面许多属性的初始转移可以被放大,以包括初始有效载荷中的所有属性,请记住,您只想传输以您希望显示的初始对数刻度显示的数字的值(这意味着,如果用户第一次加载页面或单击属性时,数字不会在屏幕上显示,您可以跳过这些数字)。任何超出初始有效负载的内容都可以在客户端上进行计算。

{ 
  "n": [18,12,9,11,9,7,8,2,6,1,4, ...] // number of properties x 1-2K
  "p": [1,2,3,5,7,13,...] // prime numbers x 1-2K
  "f": [1,2,6, ...] // factorials x 1-2K
}

我的猜测是,像这样的JSON对象大约是30-60K,但您可以通过删除算法不是递归的属性并让客户端本地计算这些属性来进一步减少这一点。

如果你想用另一种方法在处理大数字时压缩这些数组,你可以将数组格式化为VECTOR,而不是数字列表,存储一个数字和下一个数字之间的差异,这将在处理大数据(>1000)时减少空间。上面使用向量的JSON示例如下:

{ 
  "n": [18,-6,-3,2,-2,-2,1,-6,4,-5,-1, ...] // vectorised no of properties x 1-2K
  "p": [1,1,2,2,2,6,...] // vectorised prime numbers x 1-2K
  "f": [1,1,4, ...] // vectorised factorials x 1-2K
}

我认为最简单的方法是将数据集分解为多个数据文件。然后,"客户端"可以根据用户想要的数量下载所需的文件。

这样做的一个优点是,您可以根据需要调整数据文件的大小,从每个文件一个数字到一个文件中的所有数字。客户端只需要知道如何选择其编号所在的文件。这确实需要一些服务器,但它所需要做的就是提供静态数据文件。

为了减少数据负载,您还可以使用浏览器中的本地存储来缓存数据文件。