2015-05-12 24 views
1

我需要用JSON模拟1,000,000+个数据点。我想到的是这样做的方法有两种:JSON中的时间序列数据

一)对象的数组:

[{time:123456789,value:1432423},{time:123456790,value:1432424},....] 

B)嵌套数组

[[123456789,1432423],[123456790,1432424],....] 

天真地比较这两种方法,它感觉后者更快,因为它使用较少的字符,但较少描述。 B真的比A更快吗?你会选择哪一个,为什么?

是否有第三个做法?

+0

其中对于更快?创建输出?解析?转移?另外,恕我直言,1M +条目尖叫一些其他形式的表示。 – wonderb0lt

+0

在客户端解析更快 –

+0

那么,**测试**两种方法和**决定**基于硬事实(sub-usec计时,传输和处理延迟,峰值资源消耗,延期垃圾收集问题) – user3666197

回答

0

如果你的时间序列数据模型的一些连续函数,尤其是在固定的时间间隔,则可能是增量压缩的更有效的表示,即使你仍然在使用JSON:

[ 
    {time:10001,value:12345}, 
    {time:10002,value:12354}, 
    {time:10003,value:12354}, 
    {time:10010,value:12352} 
] 

可以表示为:

[[10001,1,1,7],[12345,9,,-2]] 

其为4倍较短的表示。

原来可以与重构:

[{time:a[0][0],value:a[1][0]},{time:a[0][0] + a[0][1]||1, value: a[1][0] + a[1][1]||0 ... 
0

要增加另一个例子(想法: '时间是关键'):

ts1 = {123456789: 1432423, 123456790: 1432424} 

有人可能会想象:

ts2 = {"2017-01-01": {x: 2, y: 3}, "2017-02-01": {x: 1, y: 5}} 

符号很紧凑。

当你想拿到钥匙,使用Object.keys

Object.keys(ts2) // ["2017-01-01", "2017-02-01"] 

然后,您可以用这些键或使用迭代得到的值更多的实验Object.values

Object.values(ts2) // [{x: 2, y: 3}, {x: 1, y: 5} 

在条款的速度:在这里工作的一个阵列10.000.000物品的快速测试在这里工作:

obj3 = {}; 
for(var i=0; i < 10000000; i++) {obj3[i] = Math.random()}; 
console.time("values() test"); 
Object.values(obj3); 
console.timeEnd("values() test"); 
console.time("keys() test"); 
Object.keys(obj3); 
console.timeEnd("keys() test"); 

我的机器上的结果(Chrome,3。2GHz的至强):

  • 值()试验:181.77978515625ms
  • 键()试验:1230.604736328125ms
+0

旁注:请注意,如果两个键的类型相同,并且它们遵循典型的顺序并且对象尚未被触摸,则可能可以假定该顺序已插入。但是当你修改对象时,这个假设不再成立:对象没有秩序。当订单很重要时,请检查新的[Map](http://2ality.com/2015/08/es6-map-json.html)结构,该结构由一组对或嵌套数组启动,就像第二个问题作者的建议) – murb