2015-05-12 2 views
1

Мне нужно моделировать 1 000 000+ точек данных в JSON. Я имею в виду два способа сделать это:Данные временных рядов в JSON

а) массив объектов:

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

или

б) Вложенные массивы

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

Наивно сравнивая эти два подхода, его похоже, что последний быстрее, потому что он использует меньше символов, но менее описателен. Действительно ли это быстрее, чем? Какой из них вы бы выбрали и почему?

Есть ли 3-й подход?

+0

Быстрее в каком отношении? Создание вывода? Синтаксический? Перенос? Кроме того, IMHO, 1M + записи кричат ​​для какой-то другой формы представления. – wonderb0lt

+0

Быстрее при разборе на стороне клиента –

+0

Ну, тогда ** тест ** и подходы ** и ** решать ** на основе жестких фактов (время субсеанса, латентность транспортировки и обработки, потребление пиковых ресурсов, отложенные проблемы сбора мусора) – user3666197

ответ

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

Почему?

  1. Итерирование по примитивному массиву происходит быстрее.
  2. сравнима с «размером JSON» с б), но вы не потеряете «колонка» информация

это НПМ может заинтересовать: https://github.com/michaelwittig/fliptable

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

  • значения() Тест: 181.77978515625ms
  • ключи) тест (1230.604736328125ms:
+0

Sidenote: Обратите внимание, что, когда обе клавиши имеют один и тот же тип, и они следуют типичному порядку, и объект не был затронут, вы, вероятно, можете предположить, что заказ указан как вставленный. Но когда вы изменяете объект, это предположение больше не выполняется: объекты не имеют порядка. Когда порядок важен, проверьте новую структуру [Map] (http://2ality.com/2015/08/es6-map-json.html), которая инициируется массивом пар или вложенными массивами, точно так же, как 2-й предложение автора вопроса) – murb

Смежные вопросы