2

我有一个大图,它在 Java Servlet 中处理以用于路由目的。Graph 有 100k+ 个节点,所以我无法为每个新调用重新加载它。目前,该图从我的数据库加载到 RAM 中并在 Hashmap 中引用。

当我启动 servlet(创建一个新实例)时,我需要通过 id 在图中找到 startnode。因此我使用哈希图。

这一切都很好。

我的问题是,在我的路由任务中,我需要更改图表中的某些属性,即行进距离。对于每个创建的实例,这些属性当然需要是单独的。目前,我通过在创建新实例时重置所有“非静态”属性来处理该任务。这就产生了两个问题。

A)实例不是线程安全的

B) 重置非常耗时。高达实际路由的 10 倍以上。

所以我需要的是我的 Servlet 的所有实例的静态 Hashmap。这个 Hashmap 需要包含我网络的所有节点。这些节点需要具有静态属性,如 id、坐标、邻居节点等,但也需要非静态属性,如行进距离。

我怎样才能做到这一点?

感谢阅读和分享想法

4

2 回答 2

1

您的问题可以描述为在运行时构建并为每次执行服务实例化的模型。

当您说“静态”时,我认为您的意思是“恒定”。变量属性确实特定于每个执行,而不是每个 Servlet 实例。在执行期间,您应该构建一个具有与常量属性平行的变量属性的单独结构。变量结构中的每个节点都引用常量结构中的单个节点。随着对每个节点的需求的增加,可变结构是逐渐构建的。该结构在执行结束时被丢弃。

于 2012-11-10T09:25:37.773 回答
0

我建议以单例方式将“主图”保留在 RAM 中 - 正如 Marko Topolnik 所建议的那样,但我会保留每个会话中仅更改节点的 Map,没有层次结构,只需按 ID 存储它们(如果适用,本身)

  • 当会话结束时,您只需丢弃会话中的地图,仅此而已。
  • 当一个新会话开始时,只需创建一个新的 Map 实例......
  • 如果这很关键,您还可以合并这些映射 - 但避免过早优化,因为它导致的问题远远超过它避免的问题。
  • 如果你需要访问一个节点,从原始 Map 中获取它,然后在“会话本地”映射中查找它是否存在,如果找到则合并两者中的数据。(或者,如果您存储完整节点,而不仅仅是“会话本地”映射中的更改属性,请使用该映射中的更改节点)
  • 另外,要小心,这有很多地方会导致内存泄漏......
于 2012-11-10T09:37:41.480 回答