Функция суммирования в mule dataweave занимает слишком много времени

У меня есть один ArrayList, который содержит более 45 000 записей. Я хочу создать новый список, который будет содержать сумму всех значений, когда в списке присутствует комбинация значений идентификатора и имени. например Ниже мой список ввода. Я создаю этот список, читая файл xls и сохраняю его в одной переменной под названием «myList» -

[
 {ID=481, name =ABCD, value=100}, 
 {ID=481, name =ABCD, value=50}, 
 {ID=2053, name =XYZ, value=300}
 ]

Мой код -

%dw 1.0
 %output application/java
 %function getIdname(ID, name) (ID ++ " - " ++ name)
 %function addAllValues(ID, name) sum ((flowVars.myList.Data filter (getIdname($.ID,$.name) == getIdname(ID, name))).value)
 ---
 {
 Data: flowVars.myList.Data map ((payload01 , indexOfPayload01) -> {

         ID: payload01.ID,
         name: payload01.name,
         finaValue : addAllValues(payload01.ID, payload01.name)
    })
 }

Выход -

Data=[
 {ID=481, name =ABCD, finalValue=150}, 
 {ID=2053, name =XYZ, finalValue=300}
 ]

Здесь я получаю желаемый результат, как указано выше, для файла с 5 или 10 записями. Но если я использую фактический файл с более чем 45 000 записей, выполнение моего кода занимает слишком много времени, и он не создает никаких выходных данных. Кроме того, я не получаю никаких исключений. Может ли кто-нибудь подсказать, что я здесь делаю неправильно. Почему на суммирование одинаковых рекордов уходит так много времени. Я проверил его 40 минут, но до сих пор не получил никаких результатов


person Nitesh    schedule 05.05.2019    source источник


Ответы (1)


Вы фильтруете 45000 записей на каждой итерации map, которая вызывает эту задержку (т.е. вы фильтруете 45000 раз). Вам нужно filter/group только один раз. Кроме того, ваша сеть данных не будет производить желаемый результат, потому что не используется отдельный файл.

Вместо этого попробуйте следующее:

%dw 1.0
%output application/java
%var dataByIdName = flowVars.myList.Data groupBy ($.ID ++ $.name)
---
 {
     Data: dataByIdName map {
         ID: $[0].ID,
         name: $[0].name,
         finalValue: sum $.*value
     } 
 }

Для этого не нужен отдельный объект, и вы группируете его только один раз.

person vikram92    schedule 06.05.2019
comment
Я попробую это завтра и дам вам знать. Большое спасибо за ваше предложение. - person Nitesh; 07.05.2019