Tag: mongodb

我们如何解析BSON不会产生开销性能

BSON是一个鲜为人知的图书馆,经常使用。 它是MongoKitten的核心,并且BSON规范一直被所有MongoDB用户使用。 我们开发了一个BSON库,它通过利用规范细节和我们能想到的每一个技巧,都胜过其他所有库。 序列化 在我们的BSON库中,序列化几乎不影响性能。 俩? 对于每种可能的操作,我们创建了一种专门执行该操作的专门算法。 两个操作可能共享相同的基本元数据要求,例如元素的位置。 为此,我们保留了文档中所有元素元数据的缓存。 这样,当一个操作第一次遇到一个元素时,其他操作就不需要花费时间了。 这样,我们可以高效地进行解析,并始终保持所有数据序列化。 这也意味着我们绝不会反序列化甚至读取不需要的数据。 这样可以节省CPU性能,内存副本和内存使用率,这是该库独有的。 利用规范 BSON的规范(http://bsonspec.org)具有始终位于消息核心的元素。 文献。 文档从Int32的整个长度开始,以空终止符结束。 规范中存储了长度和空终止符的原因是为了提高解析性能。 BSON可以递归嵌套文档。 因此,如果您想跳到同一级别的下一个元素,则这两个属性可以提高解析性能。 但是,如果要将元素添加到文档,则需要删除null终止符,添加该元素,然后再次添加null终止符。 并且在文档的内容更改之后,将执行其他操作以更新文档的长度。 这是没有问题的,直到您意识到此时添加5个属性会花费15个额外的堆操作。 而且堆非常昂贵。 因此,我们从顶级文档的内部存储中删除了Int32和null终止符。 这使这些操作的成本降低了四倍。 解析/提取 BSON的数据始终是序列化的,因此提取需要即时进行。 我们通过懒惰地搜索和反序列化文档中的信息来做到这一点。 在您要求我们提供某些信息之前,我们不知道文件的内容。 届时,我们将有效地解析文档,直到找到所需的信息。 这样,我们解析的内容不会超出我们的需要。 { “ username”:“ Joannis”, “年龄”:21岁, “男”:是的, “ admin”:是的, “权限”:[“全部”,“更多”,“无限”] } 如果您要访问键“用户名”,则将仅查看和缓存此“用户名”键,因为它是文档中的第一个实体。 不会扫描,缓存或查看“年龄”,“男性”,“管理员”和“权限”。 现在,当您访问male ,解析器将在username之后恢复并找到age而不反序列化值。 接下来,找到male ,将其击中,反序列化该值,停止扫描并返回该值。 现在,如果您请求age ,它已经知道age在哪里并反序列化此信息。 如果您寻找nonexistingkey ,它将一直扫描直到permissions不匹配为止,并将顶级文档标记为“完全扫描”,因此无需再次扫描。 防止将来无用的扫描无法阅读文档末尾。 如果由于某种原因您需要访问权限的第二个[1]属性,它根本不会提取permissions文档。 而是以递归的方式开始扫描permissions内的值,就像使用顶级文档一样。 […]

蒸气3与Mongo DB

任何新项目都始于一个伟大的想法。 然后,您必须查看架构。 对于好主意,您应该期望获得更大的规模和大量的数据。 因此,您应该使用NoSQL数据库。 对于我的最新项目,我认为最简单的方法是使用MongoDB。 因此,我开始设置我的项目,并在蒸气3的文档中寻找如何连接到mongo数据库的起点。 令人惊讶的是,蒸气3的文档为空empty。 但这并没有阻止我。 在不同的领域进行了一些研究,我发现有2个解决方案,其中一个是Mongokitten,这似乎是蒸气2最常用的解决方案,另一个是MongoDB本身的mongo db swift驱动程序。 因此,我感谢MongoDB为构建友好的本机Swift驱动程序所做的努力,该驱动程序支持Swift Package Manager的使用。 我认为这可能非常适合我的服务器端swift项目。 我决定使用MongoDB的驱动程序。 那么如何开始呢? 首先,我必须将依赖项添加到我现有的蒸气3项目中。 为此,我必须将mongo驱动程序的url和版本添加到Package.swift文件中并获取新的源代码。 让包=包( 依赖项:[ … // Mongo Db .package(网址:“ https://github.com/mongodb/mongo-swift-driver.git”,来自“ 0.0.7”) ], 目标:[ .target(name:“ App”,依赖项:[“ MongoSwift”,“ Vapor”]), … ]) 这很容易,但是现在我需要知道如何在蒸气框架内使用它。 我在mongo swift驱动程序项目的示例区域中找到了起点。 通过此代码示例,我可以设置数据库连接并将客户端实例注册为蒸气框架运行时中的服务。 为此,必须扩展Mongo Client,以便将服务协议应用于该协议。 //configure.swift //准备好mongo收集服务 public func configure( _ config: inout Config, _ env: inout Environment, […]

PFQuery不能调用保存的数据

所以当我运行查询保存在课堂上的用户。 它告诉我即使保存在我的后端也不存在任何数据。 为什么不正确查询数据库? class DropLoc: UIViewController, CLLocationManagerDelegate { var user = PFUser.currentUser()?.objectId var post = PFObject(className:"Post") var query = PFQuery(className:"Post") var point: PFGeoPoint! let porta = CLLocationManager() func setporta() { var curGate = porta.location self.porta.delegate = self self.porta.desiredAccuracy = kCLLocationAccuracyBest self.porta.requestWhenInUseAuthorization() self.porta.startUpdatingLocation() point = PFGeoPoint(location: curGate) query.whereKey("user", equalTo: user!) query.getFirstObjectInBackgroundWithBlock() {(object: PFObject?, error: NSError?) -> […]

将图像迁移到heroku / aws

我已经成功地将我的分析数据库迁移到aws,但图像文件的url仍然像http://files.parsetfss.com/77447afb-f681-4b55-afad-6bceeb2e155a/tfss-79297c86-bd48-4d7f-87ab-c43e02d1a8f3-photo巴纽 这意味着文件仍然在parsingS3云或自己的存储的东西,所以parsingclosures后,这些文件会发生什么。 在我自己的AWS上将图像迁移到新的数据库/存储的方式是什么? 我很担心,因为我有parsingapprx 14.5 k图像。 请为您提供有价值的指导。