多少协同程序太多了?
How many coroutines is too many?
我需要加快对包含数百万个元素的某些集合的搜索。
搜索谓词需要作为参数传递。
我一直在想,最简单的解决方案(至少目前如此)是否只是使用协程来完成任务。
我现在面临的问题是我实际上一次可以创建多少个协程。 :D 作为旁注,可能同时存在多个此类搜索 运行。
我可以为每个这样的搜索创建数百万个协程(每个项目一个)吗?我应该决定每个协程的一些工作量(例如每个协程 1000 个项目)吗?我还应该决定协程数量的上限吗?
我对协同程序及其实际工作方式有粗略的了解,但是,我不知道此功能的性能限制是什么。
谢谢!
根据 kotlin coroutine starter guide,该示例启动了 100K 个协程。我相信您打算做的正是 kotlin 协程的设计目的。
协程的内存权重与从协程构建器块到挂起点的调用跟踪深度成比例。每个 suspend fun
调用都会将另一个 Continuation
对象添加到链表中,并在协程挂起时保留该对象。一个 Continuation
实例的粗略数字是 100 字节。
因此,如果您的调用跟踪深度为 5,则相当于每个项目 500 字节。一百万项是 500 MB。
但是,除非您的搜索代码涉及会使线程空闲的阻塞操作,否则您不会从协程中获得任何好处。您的任务看起来更像是 data paralellism 的一个实例,您可以使用 java.util.stream
API 非常有效地解决它(正如用户 marstran 在评论)。
如果你不会对你的集合做很多修改,那么就把它存储在一个 HashMap 中,
否则将其存储在 TreeMap 中。然后只需在那里搜索项目。我相信那里实施的搜索方法经过优化,足以在眨眼间处理一百万个项目。在这种情况下我不会使用协程。
文档(针对 Kotlin):
哈希图:https://developer.android.com/reference/kotlin/java/util/HashMap
树图:https://developer.android.com/reference/kotlin/java/util/TreeMap
我需要加快对包含数百万个元素的某些集合的搜索。 搜索谓词需要作为参数传递。
我一直在想,最简单的解决方案(至少目前如此)是否只是使用协程来完成任务。
我现在面临的问题是我实际上一次可以创建多少个协程。 :D 作为旁注,可能同时存在多个此类搜索 运行。
我可以为每个这样的搜索创建数百万个协程(每个项目一个)吗?我应该决定每个协程的一些工作量(例如每个协程 1000 个项目)吗?我还应该决定协程数量的上限吗?
我对协同程序及其实际工作方式有粗略的了解,但是,我不知道此功能的性能限制是什么。
谢谢!
根据 kotlin coroutine starter guide,该示例启动了 100K 个协程。我相信您打算做的正是 kotlin 协程的设计目的。
协程的内存权重与从协程构建器块到挂起点的调用跟踪深度成比例。每个 suspend fun
调用都会将另一个 Continuation
对象添加到链表中,并在协程挂起时保留该对象。一个 Continuation
实例的粗略数字是 100 字节。
因此,如果您的调用跟踪深度为 5,则相当于每个项目 500 字节。一百万项是 500 MB。
但是,除非您的搜索代码涉及会使线程空闲的阻塞操作,否则您不会从协程中获得任何好处。您的任务看起来更像是 data paralellism 的一个实例,您可以使用 java.util.stream
API 非常有效地解决它(正如用户 marstran 在评论)。
如果你不会对你的集合做很多修改,那么就把它存储在一个 HashMap 中, 否则将其存储在 TreeMap 中。然后只需在那里搜索项目。我相信那里实施的搜索方法经过优化,足以在眨眼间处理一百万个项目。在这种情况下我不会使用协程。
文档(针对 Kotlin):
哈希图:https://developer.android.com/reference/kotlin/java/util/HashMap
树图:https://developer.android.com/reference/kotlin/java/util/TreeMap