首页 > 解决方案 > GeoFire 4 观察键输入的快照大小和计费

问题描述

我正在使用 geofire 检索半径内的密钥,需要帮助来了解如何对其进行分析以降低成本。

在我用于输入密钥的代码下方:

/**

            How observers work for goquery
 https://stackoverflow.com/questions/45179245/geofire-swift-3-cant-stop-observing
 */

var itemsProcessed = 0
self.circleQuery!.observe(.keyEntered, with: { (key: String!, location: CLLocation!) in

    itemsProcessed = itemsProcessed + 1
NSLog("Controller | initiateGeoQuery | processed key \(itemsProcessed) with value: '\(key)', it has entered the search area and is at location '\(location)' , cirecleQuery has center: \(self.circleQuery!.center) , and radius: \(self.circleQuery!.radius)")


    NSLog("AEViewController waiting 60 seconds before next key entered")
    sleep(60)

在这个测试用例中,我在半径外有 320 个节点,位于中国,在范围内有 2 个节点,我在欧盟。

我得到以下输出:

2020-02-15 15:01:55.198665+0000 Renal2[14181:706800] Controller | initiateGeoQuery | processed key 1 with value: 'Optional("adROWaUdK5gd6JKAfMW8DzfXpJB3")', it has entered the search area and is at location 'Optional(<xx.34939780,yy.23826435> +/- 0.00m (speed -1.00 mps / course -1.00) @ 15/02/2020, 15:01:55 Greenwich Mean Time)' , cirecleQuery has center: <xx.34939292,yy.23826781> +/- 65.00m (speed -1.00 mps / course -1.00) @ 15/02/2020, 15:01:54 Greenwich Mean Time , and radius: 50.0
2020-02-15 15:02:55.201683+0000 Renal2[14181:706800] Controller | initiateGeoQuery | processed key 2 with value: 'Optional("9fzIKheb8Ubvmu1tCA9V0uw0DOj1")', it has entered the search area and is at location 'Optional(<xx.34959316,yy.23812573> +/- 0.00m (speed -1.00 mps / course -1.00) @ 15/02/2020, 15:01:55 Greenwich Mean Time)' , cirecleQuery has center: <xx.34939292,yy.23826781> +/- 65.00m (speed -1.00 mps / course -1.00) @ 15/02/2020, 15:01:54 Greenwich Mean Time , and radius: 50.0

在 Firebase 探查器上,对于输入的第一个键:

┌────────────────────────────────────────────────┬───────────┬───────┬──────────┐
│ Path                                           │ Total     │ Count │ Average  │
├────────────────────────────────────────────────┼───────────┼───────┼──────────┤
│ /GeoFire                                       │ 118.72 kB │ 4     │ 29.68 kB │

对于第二个:

┌──────┬───────┬───────┬─────────┐
│ Path │ Total │ Count │ Average │
└──────┴───────┴───────┴─────────┘

这完全是意料之中的,而且匹配GeoFire + Swift 3 也不能停止观察

出乎意料的是,如果我使用半径外的 150 个键而不是 320 个键运行相同的测试,则带宽如下:

┌───────────────────────────────────────────────────┬───────────┬───────┬──────────┐
│ Path                                              │ Total     │ Count │ Average  │
├───────────────────────────────────────────────────┼───────────┼───────┼──────────┤
│ /GeoFire                                          │ 56.04 kB  │ 4     │ 14.01 kB │

现在,考虑到当今商业模式中应用程序是全球性的真实场景,假设有 1.000.000 个密钥分布在世界各地并不少见。由于在我的例子中光线大约是 50 公里,一个现实的场景是在光线中有大约 20/30 个键。

我是否必须为 1.000.000 x 0.36 KB,差不多 370 MB 付费?每个会话?

根据下面的博客,我肯定在这里做错了

https://firebase.googleblog.com/2014/06/geofire-20.html

我可以看到:

GeoFire 对于如何在查询中查找键很聪明。它不需要将所有 GeoFire 数据加载到内存中。如果您的用户正在寻找旧金山的自行车商店,GeoFire 将不会加载纽约位置的数据,只会意识到它们位于该国的另一边。它只检查实际附近的位置。无论您的数据集有多大,这都能让您的应用程序轻巧且响应迅速。

当我开始这个项目时,我假设账单也应该很轻,你能帮我理解我做错了什么吗?

非常感谢。

标签: swiftfirebasegeofire

解决方案


推荐阅读