我正在用 Spine、Node.js 等编写一个独立的 javascript 应用程序(如果您有兴趣,可以使用 Here is an earlier incarnation)。基本上,该应用程序是一个交互式“数字属性”浏览器。这个想法是你可以选择任何数字,看看它拥有什么属性。它是素数还是三 Angular 形等?共享相同属性的其他数字在哪里?那种事。
目前我可以很容易地显示数字 1-10k,但我想显示数字 100 万,甚至更好的 10 亿的属性。
我希望我的客户端下载一组静态数据文件,然后使用它们将信息呈现给用户。我不想编写服务器后端。
目前我使用 JSON 作为数据文件。对于某些数据,我知道一个简单的算法来导出我在客户端寻找的信息,我使用它(即,它是均匀的吗?)。对于更难的数字,我预先计算它们,然后将值存储在 JSON 可解析数据文件中。我对整个事情有点过头了 - I implemented 是一个纯 javascript bloom filter 并且当素数没有扩展到 100 万时,我尝试在下面使用 CONCISE bitmaps (这没有帮助)。最终我意识到,如果我将数据表示为 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 算法进一步压缩它,但由于您只能在屏幕上显示有限数量的数字(桌面上
更新 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
}
关于javascript - 为 JavaScript 客户端编码/解码大量数据的最佳方法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8790296/