Java 无需使用数据库即可快速访问数据?

Java 无需使用数据库即可快速访问数据?,java,android,geolocation,latitude-longitude,Java,Android,Geolocation,Latitude Longitude,我正在寻找一种快速访问一些缓冲数据的解决方案: 我有一堆(比如说多达200个)缓存的位置信息,包括纬度和经度以及一些附加信息。现在我想(非常频繁地)比较我的当前位置,并从缓存列表中找到最接近当前位置的位置。对所有缓存的位置进行距离计算以找到最近的位置是一件消耗资源的事情,我宁愿避免这样做 此外,还需要有向缓存列表添加新位置和删除旧位置的可能性,但这是一件容易的事情,因为这不是时间关键性的,而且很少进行 有什么想法吗?如何尽可能有效地计算缓存位置列表中最近的位置 谢谢 如果您想避免使用SQLite

我正在寻找一种快速访问一些缓冲数据的解决方案:

我有一堆(比如说多达200个)缓存的位置信息,包括纬度和经度以及一些附加信息。现在我想(非常频繁地)比较我的当前位置,并从缓存列表中找到最接近当前位置的位置。对所有缓存的位置进行距离计算以找到最近的位置是一件消耗资源的事情,我宁愿避免这样做

此外,还需要有向缓存列表添加新位置和删除旧位置的可能性,但这是一件容易的事情,因为这不是时间关键性的,而且很少进行

有什么想法吗?如何尽可能有效地计算缓存位置列表中最近的位置


谢谢

如果您想避免使用
SQLite
DB,我认为您唯一能做的就是将您的位置保存到一个文件(
文本文件/xml文件
)中,并在访问应用程序时将该文件解析为内存中的结构,如
列表/ArrayList


您必须在每次访问应用程序时检查此结构是否为null,如果为null,则再次解析它

我真的认为您应该为此使用SQLite,尤其是在性能对您很重要的情况下。它不必很复杂,你所需要的只是一个带有标记的简单表格

CREATE TABLE markers(_id INTEGER PRIMARY KEY, lat REAL, lon REAL);
先填好你的桌子

BEGIN TRANSACTION;
INSERT INTO markers VALUES (NULL,lat1,lon2);
....
INSERT INTO markers VALUES (NULL,lat200,lon200);
COMMIT;
然后,一个简单的查询将完成查找距离位置(x,y)最近的标记的工作


因为sqrt是一个单调的函数,所以不需要按排序的平方根。

创建一个文件并访问它与SQL是一样的,差别是如此之小以至于不相关,因为它们都在访问“硬盘”(在移动设备中是存储空间),因此延迟相同

我喜欢SQLite数据库的想法,因为您可以用一条语句检查整个表,以得到正确的答案(您只需正确构造语句)。请记住,SQL是一种非常智能和高效的数据库存储类型,从“磁盘”(表)缓存的数据会一直缓存到需要空间为止

然而,如果您愿意,您可以读取该表一次,将其放入内存(一些全局可访问的变量),然后从那里继续

PS:我想说重新考虑SQLite数据库,为你的应用程序做一些测试计时,看看结果。
让我知道发生了什么,我很感兴趣。

< P>如果你不想使用数据库,考虑使用某种形式的树将数据存储在内存中。如果你只是对2D空间感兴趣,那么a就可以了。与简单的线性搜索相比,这可以显著降低搜索的复杂性,并且可以很好地处理人口稀少的区域(例如,如果许多点聚集在特定区域,彼此相距很远)


还有其他BSP树可能更有效,但通常更难实现和调试。您可能希望找到一个库,以避免从头开始编写数据结构。

为什么不能使用数据库来完成此操作?SQLite将能够非常快速地完成这一任务,这种解决方案的优势在哪里?为了找到最接近的位置,将进行相同的计算,并添加一些额外的资源,用于解析SQL语句、访问接口、从磁盘检索数据。与什么相比,优势是什么?你说过你不想使用SQLite DB,这是最好的选择。解析时间和磁盘访问所需的时间是正确的。但最终,您将不得不以某种方式存储数据。你不能只把它留在内存中。我认为Elmi对缓存的意思是内存中的缓存,访问时间远低于接触磁盘的时间。Opps,一定错过了这一部分,Emil是正确的,除非你想使用共享首选项()。Elmi,你的术语不准确,任何数据存储都被视为数据库,所以你是通过“不使用数据库访问数据”来指SQL吗?@LuckyMe,OP想要一种不使用DB而使用其位置数据的方法(我认为这是内置SQLite DB选项)。所以下一个最好的选择是使用一个文件。OP无法将位置数据保留在内存中,因为如果用户离开应用程序一段时间,GC可能会删除这些数据。我不知道如何将200个条目(OP需要什么)保存到SharedReferences中。@Emil Adz,OP和GC是什么?可以系统地保存到SharedReference中。不过,我还是同意你的看法,我会订购它们:SQL>File>SharedReferences。建议使用SQL for sure.OP-GC-Garbage Collector。如果您能为我介绍一种在SharedReference中保存200个条目的方法,我将非常高兴。我同意你的订单,但是OP特别要求一个没有DB的解决方案,所以这是下一个最好的选择。那个“选择…限制1”的东西看起来既瘦又小,但在我看来不是!数据库在内部做什么?我想它必须以一种通用的方式做同样的事情,就像我可以更快地使用专门的代码一样:计算每个存储位置的差异,只是为了找到一个最接近的位置。Elmi,你错了,数据库是为大型计算而设计的,用于处理此类查询,不管你写什么代码,将比SQl计算该语句所需的速度慢。@LuckyMe就是这样写的,我可以保证您将无法编写比此查询更快的代码,我怀疑很多人能够。为什么不试着编写代码,看看这个查询需要多少时间?你会感到惊喜;-)
SELECT * FROM markers ORDER BY (x-lat)*(x-lat)+(y-lon)*(y-lon) LIMIT 1;