0

我有一组复杂的 XML 对象,它们是存储位置数据和属性

有些商店有 50 个商店位置,有些商店有 1500 个商店位置,有些商店有 20,000 个商店位置。

我想为商店创建一个 Java 对象列表,让我可以按纬度/经度过滤商店位置以及有关商店位置的其他数据

最重要的过滤器是纬度/经度;在所有情况下,我都需要通过最大和最小纬度以及最大和最小长度来查找区域内的所有商店:在 (40.146364,-75.406188) 和 (40.228694,-75.491295) 之间

允许重复的纬度/经度值

我在想我会创建一个对象,其中包含一些用于过滤的关键显式属性(如 lat、long、存储类型代码)和一个包含完整 XML 的字符串

我在想这些对象像 ArrayList 或其他类型一样进入 Collection 中,而键是 Lat/long 的字符串。

快速过滤收藏很重要;它每天会发生数百万次。创建集合发生在启动时,如果过滤器速度很快,性能可能会降低。

lat/long 过滤器具有非常高的特异性;具有 1500 个商店位置的示例通常返回 50 个或更少的商店位置。

我在想我会遍历集合,并解析纬度/经度的密钥。如果纬度/经度在所需范围内,我将获取对象并过滤其他不太具体的搜索条件。

由于查询的数量和相同的查询几乎永远不会重复,直接查询数据库不是一个好主意。数据库缓存不会发生,因为每个查询的参数会不同(纬度/经度通常有 5 个小数位)。浏览集合意味着我将负载从数据库转移到应用服务器,但 Oracle 许可证和集群比负载平衡一堆 AWS 或 Tomcat 实例更昂贵/复杂

小组对这些要求和约束的实现有什么想法吗?

4

2 回答 2

0

由于经纬度查询,您可能希望将数据存储在区间树中。 这是我发现的一个 Java 实现。简而言之,区间树可让您查询区间,快速定位所有对象,例如纬度在 x1 和 x2 之间的对象;然后将其与经度在 y1 和 y2 之间的对象相交。

于 2013-04-22T16:51:12.713 回答
0

The numbers you're talking about aren't scary and I would expect suitable performance from an in-memory implementation. If you can't store the complete object tree in memory, at least store the salient info (lat/long + ids) and filter on that.

As ever, I would implement some solution first before deciding performance is an issue.

于 2013-04-22T16:50:17.510 回答