对内存数据范围进行高性能过滤



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

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

我想为一个商店创建一个Java对象列表,让我可以通过Lat/long和其他关于商店位置的数据来过滤商店位置

最重要的过滤器是lat/long;在所有情况下,我将需要找到一个区域内的所有商店的最大和最小晚,最大和最小长示例:在(40.146364,-75.406188)和(40.228694,-75.491295)之间

允许重复的lat/long值

我想我会创建一个对象与几个关键的显式属性,我用来过滤(如lat, long,存储类型代码)和一个字符串与完整的XML

我认为对象在集合中像ArrayList或其他类型一样,键是Lat/long的字符串。

快速过滤集合很重要;这一天会发生几百万次。集合的创建在启动时进行,如果过滤器速度很快,性能可能会降低。

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

我想我应该遍历集合,并解析键的lat/long。如果lat/long在期望的范围内,我将获得该对象并过滤其他不太具体的搜索条件。

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

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

您所谈论的数字并不可怕,我希望内存实现具有合适的性能。如果你不能在内存中存储完整的对象树,至少存储突出信息(lat/long + ids),并在此基础上进行过滤。

和以往一样,在确定性能是一个问题之前,我会先实现一些解决方案。

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

最新更新