不使用数据库快速访问数据?

时间:2013-05-16 06:56:39

标签: java android geolocation latitude-longitude

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

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

此外,还需要有可能在缓存列表中添加新位置并删除旧位置 - 但这很容易,因为它不是时间关键的,只是很少进行。

那么任何想法?我怎样才能尽可能高效地评估我的缓存位置列表中最接近的位置?

谢谢!

4 个答案:

答案 0 :(得分:1)

如果您想避免使用SQLite数据库,我认为您可以这样做的唯一方法是将您的位置保存到文件(text file/xml file),并且在访问您的应用程序时将此文件解析为内存中的结构,如List/ArrayList

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

答案 1 :(得分:1)

我真的认为你应该使用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)

SELECT * FROM markers ORDER BY (x-lat)*(x-lat)+(y-lon)*(y-lon) LIMIT 1;

ORDER BY中不需要平方根,因为sqrt是一个单调的函数。

答案 2 :(得分:0)

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

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

然而,如果你愿意,你可以读一次表,把它放在内存中(一些全局可访问的变量),然后从那里继续。

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

答案 3 :(得分:0)

如果您不想使用数据库,请考虑使用某种形式的Binary Space Partitioning树将数据存储在内存中。如果您只对2D空间感兴趣,那么Quadtree将起作用。与简单的线性搜索相比,这可以显着降低搜索的复杂性,并且可以很好地应对人口稀少的区域(例如,如果很多点聚集在特定区域,彼此相距很远)。

还有其他BSP树可能更有效,但通常更难实现和调试。您可能希望找到一个库来保存自己不得不从头开始编写数据结构。