【问题标题】:How to optimize spatial data retrieval in Android如何在 Android 中优化空间数据检索
【发布时间】:2015-08-21 18:48:35
【问题描述】:

我有SQLite表包含1.5M行,表包含<lat,lng, info>,我想做的是,每次我从GPS收到数据“lat,lng”时,我应该访问表并显示相应的信息。

我的问题是,这个操作是否会很费时费力?如果是,每次收到 GPS 数据时,如何才能更好地从表中检索数据?

【问题讨论】:

  • 应该不是问题,听起来很简单where lat = x and lng = y。您可能需要考虑查询数据的频率问题,但您可以编写检查代码以确保不会连续查询相同的值。或者,如果您不希望对位置有太多更改,甚至可以添加缓存(这一切都取决于您的应用程序的功能)。此外,您可能需要考虑在移动设备上存储如此大表的存储空间,但同样取决于应用程序,除了存储所有数据之外,您可能没有其他选择
  • 只需将它们放在诸如ArrayList<MyLocationObject> 之类的集合中即可。尽管我认为确实没有任何必要,但正如已经说过的那样,除非您不断轮询,否则不应该有真正的开销。如果您轮询过多,只需检查您最后一次轮询的点与您当前位置之间的距离是否大于某个增量。
  • 我同意,这个问题太宽泛了。您没有提供任何上下文代码,这一切都围绕着您轮询数据库的次数的问题。如果你认为你做的太多了,很可能是太多了,你需要限制它。
  • @rmaik:在这种情况下,缓存将是当您将查询结果存储在内存中时,以便下次调用相同的查询时,您会从内存中获取结果,而不是从数据库中提取结果。例如,每次查询数据库时,将结果存储在某种列表中,键是查询输入(x 和 y)。然后每次需要查询时,首先检查列表是否匹配 x 和 y,如果找到匹配则使用该结果,如果不匹配则查询数据库(并缓存该结果)。
  • @rmaik:从内存中提取会更快,但是如果您开始进行大量查询,就会产生开销。如果缓存的内存使用量变得太大,它本身就会开始导致性能问题。选择实际上取决于情况。例如,您甚至可以将缓存限制为最后 10 个唯一查询,这可能是一个不错的选择。因此,如果设备没有移动,您不必继续查询数据库以获得相同的位置,只需使用内存中的那个。事实上,无论如何我肯定会考虑这样做

标签: android sqlite gps


【解决方案1】:

您应该使用 Spatialite,它是用于地理数据的 Sqlite 扩展,它允许您创建空间索引,然后查询包含在矩形中的数据,例如距离您的 gps 坐标 x 米左右。

【讨论】:

  • 看起来 Spatialite 已经完成了我的部分回答,而且比它还有一个 python 朋友更糟糕 - pyspatialite 2.6.1。
  • 感谢您的回答。我需要在数据库中保存的只是纬度、经度和速度信息以及道路类型。你认为我需要spatalite吗?谢谢。
【解决方案2】:

您不想搜索确切的位置(GPS 不够准确),而是搜索 nearby 条目。

使用“正常”索引时,二维区间搜索效率不高。 您需要使用 R-tree index 之类的东西,默认情况下 Android 上不可用。

如果你的表永远不会改变,你可以在另一台机器上准备 R-tree,在应用程序中,search for entries manually

【讨论】:

  • 不知道 R*Tree,看起来很有趣!
【解决方案3】:

我不确切知道您的数据是什么样的,但我要做的第一件事(鉴于 GPS 位置可能不会发生太大变化)是首先创建一个坐标范围较小的临时表,这样您就可以减少150 万条记录只有几千条。那么一切都应该更快。

我不知道@CL 谈到的 R-Tree,但如果你能设法在 android 下使用它们,它们确实看起来很有前途。

【讨论】:

  • 为 R-Tree 投票。有更简单和更合适的解决方案,但它与 R-Tree 一起工作得很好
【解决方案4】:

如果您的用例不像其他人建议的那样 - 意味着您正在寻找一个确切的位置而不是一个区域,那么您所能做的就是确保在 (lat,lng) 上添加一个索引并为最好的...

CREATE INDEX index_lat_lng ON MyTable(lat,lng);

【讨论】:

  • GPS 提供的纬度、经度实际上从不适合精确查找。也许他问了一个不清楚的问题,但你的回答并不能解决他的问题。
  • 据我了解,他想搜索特定的经纬度。如果不是他想要的,那么其他人的回答可能更相关,由他决定
  • 由于两台 GPS 接收器提供相同位置的可能性极小,尽管支架位于同一位置,因此他无法进行精确的纬度/经度搜索,
  • 他说他保存了 GPS 位置,但从未说过他获取原始 gps 数据并使用它进行查询,也许他将 gps 保存在数据库中并将其发送到其他地方,然后想从数据库,爵士乐
  • 如果您不知道纬度,则以后无法检索。你得到 lat 和 lon 一次,以后再也不会了。
【解决方案5】:

你的问题太模糊了。
what i want to do is, for every time I receive data "lat,lng" from the GPS, I should access the table and display the corresponding info.
您需要定义receive 数据的频率。
它会很详尽且耗时吗?在不知道您多久收到一次数据的情况下,可能会,也可能不会。
鉴于上述情况,您是否考虑过并假设 GPS 坐标不是来自整个商店,创建一个in memory 数据库快照,该快照是您的纬度和经度当前来自并使用该区域及其周围的区域直到它们偏离当前快照区域。此时,您将需要写出现有数据,为新坐标创建新快照。快照区域可以按度数、分钟数或秒数来定义,具体取决于我想您正在跟踪的事物预计移动的速度。

【讨论】:

  • 感谢您的回答。我需要在数据库中保存的只是纬度、经度和速度信息以及道路类型。你认为我需要spatalite吗?谢谢
  • 按照他们的建议,我将遵从 ED73170,但我没有使用过该软件。
【解决方案6】:

你可以试试这样的命令:

SELECT info FROM Table WHERE lat = 'lat' AND lng = 'long';

这还不足以满足您的目的吗?

【讨论】:

  • 问题是如何优化数据检索,而不是如何进行检索。
猜你喜欢
  • 2022-10-02
  • 2015-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-11
  • 1970-01-01
相关资源
最近更新 更多