我有一组复杂的XML对象,即Store Location数据和属性
有些商店有50个商店位置,有些商店有1500个商店位置,有些商店有2万个商店位置。
我想为商店创建一个Java对象列表,让我按Lat / long和其他有关商店位置的数据过滤商店位置
最重要的过滤器是lat / long;在所有情况下,我将需要通过最大和最小纬度以及最大和最小长度示例找到区域内的所有商店:介于(40.146364,-75.406188)和(40.228694,-75.491295)之间
允许重复的lat / long值
我在想我会创建一个对象,其中包含一些用于过滤的关键显式属性(如lat,long,商店类型代码)和带有完整XML的字符串
我以为对象会像ArrayList或其他类型一样进入Collection,而key是Lat / long的String。
快速过滤收藏很重要;它每天会发生数百万次。创建集合在启动时发生,如果过滤器速度很快,则可能效率较低。
lat / long滤波器具有很高的特异性;一个具有1500个商店位置的示例通常会返回50个或更少的商店位置。
我在想我会迭代Collection,然后解析lat / long的键。如果lat / long在期望的范围内,我将获得该对象并过滤其他不太具体的搜索条件。
由于查询的数量和相同的查询几乎不会重复,直接查询数据库不是一个好主意。数据库缓存不会发生,因为每个查询的参数将不同(纬度/经度通常有5个小数位)。通过Collection收集意味着我将负载从DB转移到App服务器,但是Oracle许可和群集比负载平衡一堆AWS或Tomcat实例更加昂贵/复杂
小组关于实施这些要求和约束的任何想法?
答案 0 :(得分:0)
您所谈论的数字并不可怕,我希望内存实现能够提供合适的性能。如果你不能将完整的对象树存储在内存中,至少要存储显着的信息(lat / long + ids)并对其进行过滤。
与以往一样,在决定性能是一个问题之前,我会首先实施一些解决方案。
答案 1 :(得分:0)
由于纬度 - 经度查询,您可能希望将数据存储在interval tree中。 Here is a Java implementation I found。简而言之,间隔树允许您查询间隔,快速定位所有对象,例如, x1和x2之间的纬度;然后将它与经度介于y1和y2之间的物体相交。