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

时间:2012-01-09 14:54:46

标签: javascript json

我正在编写一个独立的JavaScript应用程序,包括Spine,Node.js等(如果您感兴趣的话,可以使用Here is an earlier incarnation)。基本上,该应用程序是一个交互式“数字属性”资源管理器。这个想法是你可以选择任何数字,看看它拥有什么属性。它是素数还是三角形等?哪些其他数字共享相同的属性?那种事。

目前我可以非常轻松地显示数字1-10k,但我想显示数字为100万,甚至更好的10亿的属性。

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

目前我正在使用JSON作为数据文件。对于某些数据,我知道一个简单的算法来导出我在客户端寻找的信息,我使用它(即,它是否均匀?)。对于更难的数字,我预先计算它们,然后将值存储在JSON可解析数据文件中。我对整件事情有点过分了 - I implemented一个纯粹的javascript bloom filter,当它没有扩展到100万的素数时,我尝试使用CONCISE bitmaps下面的({没有帮助)。最终我意识到,如果我将其表示为JSON,那么“压缩”我的数据并不重要。

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

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

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

2 个答案:

答案 0 :(得分:4)

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

你会为自己省去很多头痛。您可以预先计算索引图表,并仅在用户选择特定数字时保留要处理的其余数据点。

对于每个号码显示的属性。现代桌面上的纯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
}

答案 1 :(得分:3)

我想说最简单的方法是将数据集分成多个数据文件。然后,“客户端”可以根据用户正在寻找的号码根据需要下载文件。

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

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