Как рассчитать дельта-массив для кумулятивного массива быстрым способом, используя JSONata? - PullRequest
0 голосов
/ 29 марта 2020

У меня есть json структура, состоящая из массива из 253 объектов местоположения. У каждого объекта местоположения есть массив, сообщающий о суммарной сумме с течением времени (массив, имеющий 67 элементов).

Я хотел бы расширить каждый объект местоположения в структуре json массивом (дельта-массив), который сообщает о увеличение на основе суммарного массива.

Следующий запрос json правильно выполняет эту задачу:

(
    covid ~> | locations | { 
        "new_total" : $map(cumulated_total, function($v, $i, $a) {$a[$i]-($i=0 ? 0 : $a[$i-1])}) 
        } |;
)

Проблема с этим запросом заключается в том, что для его выполнения требуется около 66 секунд. my intel NU C device.

Ссылка JSONata Exerciser, содержащая пример структуры ввода json вместе с запросом, который я использовал:

Обратите внимание, что когда я открываю эту ссылку, она сообщает Expression evaluation timeout: Check for infinite loop, потому что запрос также занимает слишком много времени для выполнения в моем окне JSONata Exerciser.

Ответы [ 2 ]

1 голос
/ 30 марта 2020

Не уверен, что это имеет большое значение, но вы можете попробовать перенести определение функции на верхний уровень, чтобы оно выполнялось только один раз (поскольку вы не полагаетесь на лексический контекст в теле функции):

(
    $fn := function($v, $i, $a) {$v-($i=0 ? 0 : $a[$i-1])};
    covid ~> | locations | { 
        "new_total" : $map(cumulated_total, $fn) 
        } |;
)
0 голосов
/ 29 марта 2020

Следующий запрос более производительный (47 сек c общее время). Так что это на 19 se c больше производительности по сравнению с запросом в исходном сообщении (66 se c общее время).

(
    covid ~> | locations | { 
        "new_total" : $map(cumulated_total, function($v, $i, $a) {$v-($i=0 ? 0 : $a[$i-1])}) 
        } |;
)

Как видите, я только изменил $a[$i] на $v в коде функции.

...