JSON中的时间序列数据

6

我需要对100万个以上的JSON数据点进行建模。我考虑了两种方法:

a) 对象数组:

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

或者

b) 嵌套数组

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

从表面上看,这两种方法相比较而言,似乎后者更快,因为它使用的字符更少但描述性较差。b真的比a更快吗?你会选择哪一个并为什么?

是否有第三种方法?


更快的方面是哪个?创建输出?解析?传输?此外,依我之见,超过1M条目需要其他形式的表示。 - wonderb0lt
客户端解析速度更快 - Ali Salehi
1
那么,就测试这两种方法,并根据硬性事实(子微秒计时、传输和处理延迟、峰值资源消耗、延迟垃圾收集问题)做出决定。 - user3666197
3个回答

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

为什么?

  1. 遍历基本数组更快。
  2. 与 b) 中的“JSON 大小”相当,但您不会丢失“列”信息。

这个 npm 可能会引起兴趣:https://github.com/michaelwittig/fliptable


2

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

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.77978515625毫秒
  • keys() 测试:1230.604736328125毫秒

顺便提一下:请注意,当两个键是相同类型并且它们遵循典型的顺序,并且对象尚未被修改时,您可能可以假设顺序与插入的顺序相同。但是,当您修改对象时,此假设不再成立:对象没有顺序。当顺序很重要时,请检查新的Map结构,该结构由一对数组或嵌套数组的数组初始化,与问题作者的第二个建议完全相同。 - murb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接