JSON中的时间序列数据

时间:2015-05-12 11:02:58

标签: javascript json streaming time-series

我需要在JSON中建模1,000,000多个数据点。我正在考虑两种方法:

a)对象数组:

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

b)嵌套数组

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

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

有第三种方法吗?

3 个答案:

答案 0 :(得分:7)

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

为什么?

  1. 迭代原始数组更快。
  2. 与" JSON尺寸相比"与b)但你不会失去"列"信息
  3. 这个npm可能很有意思:https://github.com/michaelwittig/fliptable

答案 1 :(得分:1)

如果您的时间序列数据模拟某些连续函数,特别是在常规时间间隔内,即使您仍在使用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 ...

答案 2 :(得分:1)

添加另一个示例(想法:'时间是关键'):

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 Xeon):

  • values()测试:181.77978515625ms
  • keys()测试:1230.604736328125ms