Почему конвейерная группировка с использованием потоковых сборщиков API Java занимает больше времени? - PullRequest
2 голосов
/ 13 июня 2019

Я создаю карту карты из списка, используя Stream API.Список содержит 10 миллионов записей.Я сделал это с помощью одного оператора, используя две операции 'groupingBy', как показано ниже.Проблема в том, что выполнение этого однострочного оператора занимает почти 1,5 минуты, что стало узким местом в моем критически важном для производительности приложении.

Я дал код, который я попробовал ниже, используя API параллельного потока

Map<MyKey, Map<String, List<Person>>> personMap = personList.parallelStream()
    .collect(Collectors.groupingBy(
        person -> new MyKey(person.Id(), person.getPricePointId()),
        Collectors.groupingBy(Person::getWorkType)));

Для выполнения вышеуказанного кода требуется более 1,5 минуты, что составляет почти 75% моего общего времени выполнения.Я не нахожу другого решения быстрее, чем это.Итак, мой вопрос здесь такой: максимально ли это пропускная способность для такого большого объема данных?или использование downstream (множественная groupingBy) не является правильным вариантом здесь?, если нет, то каким должен быть правильный способ сократить время выполнения?

1 Ответ

0 голосов
/ 13 июня 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...