我需要在JSON中建模1,000,000多个数据点。我正在考虑两种方法:
a)对象数组:
[{time:123456789,value:1432423},{time:123456790,value:1432424},....]
或
b)嵌套数组
[[123456789,1432423],[123456790,1432424],....]
天真地比较这两种方法,感觉后者更快,因为它使用较少的字符但描述性较差。 b真的比一个快吗?你会选择哪一个?为什么?
有第三种方法吗?
答案 0 :(得分:7)
{time:[123456789,123456790,...], value:[1432423,1432424,...]}
为什么?
这个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):