Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于在线生产算法的Java分布式列表或队列_Java_Algorithm_Distributed_Priority Queue_Production Environment - Fatal编程技术网

用于在线生产算法的Java分布式列表或队列

用于在线生产算法的Java分布式列表或队列,java,algorithm,distributed,priority-queue,production-environment,Java,Algorithm,Distributed,Priority Queue,Production Environment,我目前参与了一个项目,将基于dijkstra/a-star算法的搜索算法转移到生产系统中。基本上,算法会收到请求并开始搜索,直到找到最佳解决方案,这通常需要几秒钟的时间。问题在于,我们算法的原型版本依赖于JDK优先级队列(基本上是一个二进制堆),它在搜索过程中消耗大量内存。因此,如果我们想将算法放在一个生产系统中,同时处理多个请求,那么一个大问题就是如何处理系统的可伸缩性。我们正试图找出实现这一目标的最佳方案,我们脑海中闪现的想法是: 最简单的方法是在每次收到请求时创建一个新的算法实例,但这似

我目前参与了一个项目,将基于dijkstra/a-star算法的搜索算法转移到生产系统中。基本上,算法会收到请求并开始搜索,直到找到最佳解决方案,这通常需要几秒钟的时间。问题在于,我们算法的原型版本依赖于JDK优先级队列(基本上是一个二进制堆),它在搜索过程中消耗大量内存。因此,如果我们想将算法放在一个生产系统中,同时处理多个请求,那么一个大问题就是如何处理系统的可伸缩性。我们正试图找出实现这一目标的最佳方案,我们脑海中闪现的想法是:

  • 最简单的方法是在每次收到请求时创建一个新的算法实例,但这似乎不是解决问题的有效方法(我们需要为每个实例提供大量ram)

  • 当队列太大时,使用某种持久有效的存储/数据库将队列的部分元素移动到那里。这可以缓解内存问题,但会出现新的问题,如保持内存队列中的元素与存储中的元素之间的顺序

  • 将处理队列的任务委托给大型框架,如Hazelcast。算法的每个实例都可以使用一个。问题是Hazelcast没有任何类型的排序队列,因此我们必须从队列外部显式处理队列的顺序,这是一个很大的性能问题

  • 我们也在考虑使用ActiveMQ的想法,尽管该框架不是为此类问题而设计的。仅管理9个不同的优先级,这对于我们的问题来说是不够的,因为我们根据浮点值(无限优先级)对队列中的元素进行排序


我们完全迷失在这个架构设计问题中。欢迎提供任何建议。

将实际数据保存在数据库中,并维护数据哈希索引及其相应优先级的优先级队列。这不应该占用太多空间。另外,尝试使用斐波那契堆而不是二进制堆实现优先级队列。。。Fibonacci对于更大的数据集更快。您可以使用ZooKeeper或GridGain用于分布式优先级队列。Hazelcast或Redis