【问题标题】:Performant filtering for a range from in memory data内存数据范围的高性能过滤
【发布时间】:2013-04-15 15:51:42
【问题描述】:

我有一组复杂的 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 个或更少的商店位置。

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

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

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

【问题讨论】:

    标签: java performance collections filtering


    【解决方案1】:

    由于经纬度查询,您可能希望将数据存储在interval tree 中。 Here is a Java implementation I found。简而言之,区间树可以让您查询区间,快速定位所有对象,例如x1 和 x2 之间的纬度;然后将其与经度在 y1 和 y2 之间的对象相交。

    【讨论】:

    • 在查看了实现之后,我不确定这会更快,并且它使用了一个不好的 TreeMap,它允许有两个具有相同纬度/经度的位置
    • 您可以将 TreeMap 换成 TreeMultiMap
    【解决方案2】:

    您所说的数字并不可怕,我希望内存实现具有合适的性能。如果您无法将完整的对象树存储在内存中,请至少存储显着信息(纬度/经度 + ids)并对其进行过滤。

    与以往一样,在确定性能是否存在问题之前,我会先实施一些解决方案。

    【讨论】:

    • 我正计划按照您的描述进行;我想知道的是,有没有人有建议可以改进我打算存储信息的内容和方式,以及我打算如何过滤结果集以匹配搜索条件
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-26
    • 2021-01-10
    • 1970-01-01
    • 2020-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多