如何解决加快嵌套结构的创建
我的代码按预期工作,我只是想加快速度。
我有一个数据库表,其中包含数百万个传感器测量值。 当我查询数据库中过去两个月的测量值(按传感器的名称排序)时,我可以获得大约30万个结果。
然后我逐步浏览结果,并想从数据创建嵌套的struct对象。 这里是一些较短的伪代码:
struct Measurement {
var date: Int
var temp: Double?
...
}
struct Sensor {
var sensorName: String
var measurements: [Measurement]
}
var sensors:[Sensor] = []
...
for r in dbResults {
...
let m = Measurement(date: r.date,temp: r.temp1,... )
if let index = sensors.firstIndex(where: { $0.sensorName = r.name }) {
sensors[index].measurements.append(m)
} else {
sensors.append(Sensor(sensorName: r.name,measurements: [m]))
}
}
但是,这相当慢。完成循环大约需要一分钟。
有没有办法加快这个过程?我假设.firstIndex
花费的时间太长。
我当时正在考虑在并行线程上创建对象,但是我不确定如何最好地做到这一点,而在检查.firstIndex
时又不会冒竞争的风险。
感谢任何想法
解决方法
我将存储空间更改为字典
var sensors:[String: Sensor] = [:]
...
for r in dbResults {
...
let m = Measurement(date: r.date,temp: r.temp1,... )
sensors[r.name,default: Sensor(sensorName: r.name,measurements: [])].measurements.append(m)
}
,
不要自己重写Dictionary(grouping:by:)
。有人免费为您维护!
将var
放在此处时:?
let sensors = Dictionary(grouping: dbResults,by: \.name).map {
Sensor(
sensorName: $0,measurements: $1.map { .init(date: $0.date,temp: $0.temp1) }
)
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。