Сколько сопрограмм это слишком много? - PullRequest
3 голосов
/ 19 марта 2019

Мне нужно ускорить поиск по некоторой коллекции с миллионами элементов.Предикат поиска должен быть передан в качестве аргумента.

Мне было интересно, не будет ли самое простое решение (по крайней мере, на данный момент) просто использовать сопрограммы для выполнения задачи.

Вопрос, с которым я сейчас сталкиваюсь, заключается в том, сколько сопрограмм я могу создать за один раз.: D В качестве дополнительного примечания может быть более одного такого поиска, запущенного одновременно.

Могу ли я сделать миллионы сопрограмм (по одному на каждый элемент) для каждого такого поиска?Должен ли я принять решение о некоторой рабочей нагрузке на сопрограмму (например, 1000 элементов на сопрограмму)?Должен ли я также принять решение о некотором ограничении количества сопрограмм?

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

Спасибо!

Ответы [ 3 ]

6 голосов
/ 19 марта 2019

Масса памяти сопрограммы масштабируется с глубиной трассировки вызова от блока конструктора сопрограмм до точки приостановки. Каждый вызов suspend fun добавляет еще один объект Continuation в связанный список, и он сохраняется, пока сопрограмма приостановлена. Грубая цифра для одного экземпляра Continuation составляет 100 байт.

Итак, если у вас есть глубина трассировки вызовов, скажем, 5, то это составляет 500 байт на элемент. Миллион предметов - это 500 МБ.

Однако, если в вашем поисковом коде не используются блокирующие операции, из-за которых поток простаивает, вы ничего не получите от сопрограмм. Ваша задача больше похожа на экземпляр паралеллизма данных , и вы можете решить ее очень эффективно, используя java.util.stream API (как отметил пользователь marstran в комментарии).

0 голосов
/ 19 марта 2019

Если вы не будете делать много изменений в вашей коллекции, просто сохраните ее в HashMap, иначе сохраните в TreeMap.Тогда просто ищите предметы там.Я считаю, что методы поиска, реализованные там, достаточно оптимизированы, чтобы обрабатывать миллион элементов за мгновение.В этом случае я бы не использовал сопрограммы.

Документация (для Kotlin):

HashMap: https://developer.android.com/reference/kotlin/java/util/HashMap

TreeMap: https://developer.android.com/reference/kotlin/java/util/TreeMap

0 голосов
/ 19 марта 2019

Согласно руководству по для котлин-сопрограммы kotlin, в примере запускаются 100K сопрограммы. Я верю, что вы намерены сделать именно то, для чего предназначена kotlin сопрограмма.

...