我需要加快搜索一些收集数以百万计的元素。搜索谓词需要作为参数传递。
我一直在想,最简单的解决方案(至少目前是这样)是不是仅仅是使用协同机制来完成这项任务。
我现在面临的问题是,我可以一次创建多少个协同线。D附带说明,可能有不止一个这样的搜索同时运行。
我能为每一个这样的搜索建立数百万个协同(每个项目一条)吗?我是否应该决定每个协同线的一些工作负载(例如,每个协同线1000项)?我是否也应该决定一个上限的合作数量?
我对协同器及其实际工作方式有大致的了解,但是,我不知道这个特性的性能限制是什么。
谢谢!
发布于 2019-03-19 10:22:59
从coroutine生成器块到悬挂点的调用跟踪深度的协同线刻度的内存权重。每个suspend fun调用都会将另一个Continuation对象添加到链接列表中,这将在coroutine挂起时保留。一个Continuation实例的粗略数字是100个字节。
因此,如果您的调用跟踪深度为5,那么每个项的调用跟踪深度为500个字节。一百万件是500 MB。
但是,除非您的搜索代码涉及阻塞会使线程空闲的操作,否则您将无法从协同器中获得任何信息。您的任务看起来更像是数据paralellism的实例,您可以使用java.util.stream API非常有效地解决它(如用户马斯特兰在注释中所指出的)。
发布于 2019-03-19 09:26:51
根据kotlin coroutine起动机指南,该示例启动100 K协同工作。我相信你想做的正是kotlin协同设计的目的。
发布于 2019-03-19 15:30:07
如果您不会对您的集合进行许多修改,那么只需将其存储在HashMap中,则将其存储在TreeMap中。那就在那里搜索物品。我相信在那里实现的搜索方法经过了足够的优化,可以在眨眼之间处理一百万项。在这种情况下我不会使用协同线。
文件(为Kotlin):
HashMap:https://developer.android.com/reference/kotlin/java/util/HashMap
TreeMap:https://developer.android.com/reference/kotlin/java/util/TreeMap
https://stackoverflow.com/questions/55237267
复制相似问题