Java 在缓存的ArrayList中存储大量地理位置记录,还是始终从MongoDB查询它们?

Java 在缓存的ArrayList中存储大量地理位置记录,还是始终从MongoDB查询它们?,java,mongodb,caching,arraylist,geolocation,Java,Mongodb,Caching,Arraylist,Geolocation,我正在开发一个地理定位应用程序。该应用程序在一个索引正确的MongoDB中保存了大约500K条记录。每行都有自己的纬度和经度记录值。因此,客户机必须从这些500k行中恢复200个最近的点。我关心表现。起初,我想到将所有记录(lat/lng信息)保存在缓存管理器或内存数据库中。之后,可以将给定的点(lat/lng)与缓存中的值进行比较。此时此刻,我产生了怀疑 最好将所有这些记录存储在缓存管理器中的ArrayList中,然后将记录的地理位置与ArrayList中的地理位置进行比较,以计算距离 另一方

我正在开发一个地理定位应用程序。该应用程序在一个索引正确的MongoDB中保存了大约500K条记录。每行都有自己的纬度和经度记录值。因此,客户机必须从这些500k行中恢复200个最近的点。我关心表现。起初,我想到将所有记录(lat/lng信息)保存在缓存管理器或内存数据库中。之后,可以将给定的点(lat/lng)与缓存中的值进行比较。此时此刻,我产生了怀疑

最好将所有这些记录存储在缓存管理器中的ArrayList中,然后将记录的地理位置与ArrayList中的地理位置进行比较,以计算距离

另一方面,通过这种方法,我防止了MongoDB中的大量查询,通过在ArrayList中保留大约500K条记录(地理位置),然后获取该列表以检索最近的200条记录,这可能是错误的。如果没有错的话,至少我认为这是对表现的惩罚

我如何处理这个问题


提前感谢。

将数据保存在内存中可能会提高性能。但是,当您在ArrayList中有500k条记录,并且希望搜索距离给定点最近的200条记录时,这意味着必须针对每个请求检查500k条记录中的每一条记录。这需要一段时间。可能比MongoDB需要的时间要长得多


但是,您可以通过MongoDB对其地理索引所做的相同操作来提高性能:使用为搜索而优化的更智能的数据结构。例如,一个。在平衡良好的R-树中,搜索给定区域中的所有记录是一个运行时复杂度为
logn
的操作,而不是数组列表的
n
。对于500k参赛者来说,这将是几个数量级的改进。

每个记录有多大?持有一个几百兆字节的排序映射将/应该是微不足道的。每个记录有2个字符串和1个UUID(经度、纬度、UUID)。是的,在内存中存储一个非常大的列表是完全可行的,只要您知道您正在这样做。计算预期大小,看看它有多大。请记住,JVM在启动时通常没有太多可用内存。您需要使用Xms和Xmx命令行参数将其指定为更大。在将所有内容添加到列表之前,您可能需要使用
Runtime.getRuntime().freemory()
检查可用内存。确保用户知道存在内存需求。ArrayList未针对搜索进行优化。请尝试使用HashMap进行精确搜索,或使用TreeMap进行范围搜索。谢谢您的回复。我正在考虑将所有500k记录存储在R树结构中,然后执行搜索。500k记录需要大约20GB的内存。我说得对吗?每个记录都是一个具有三个属性(2个字符串和1个UUID)的对象。@blackjack取决于字符串的大小。字符串要求每个ASCII字符有一个字节(unicode字符需要更多字节)加上一些字节作为元信息。但请注意,Java会自动进行字符串池,所以当您有重复项时,它们不会占用双内存。当我们假设每个对象有1KB的内存时,这将是500MB的内存。