Функция суммирования в муле данных занимает слишком много времени - PullRequest
0 голосов
/ 05 мая 2019

У меня есть один 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 минут, но все еще не получил никакого вывода

1 Ответ

3 голосов
/ 06 мая 2019

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

...