我的结果大约是我要绘制的50k个数据点,但这比像素更多。因此,我想使用一些高效且有意义的技术将50k记录下采样到仅约2,000条记录。
将所有记录加载到内存而不是运行算法,需要几秒钟才能运行,内存镜头最多可以加倍。
相反,我希望利用数据库进行缩减采样。是否可以使用largest triangle three buckets algorithm这样的过滤谓词,这样我就可以将繁重的数据传递给数据库进行查询?
答案 0 :(得分:0)
LTTB算法看起来太复杂,无法构成NSPredicate
查询。我认为这是不可能的。
对于这个复杂的查询,我认为如果您从数据库中提取数据并使用您自己的算法手动处理数据,这绝对是最好的。
Realm非常有效地将数据提取到内存中;只有在触摸其属性时才会对该对象进行分页。如果你附上那个' touch'在@autoreleaspool
中,您可以控制何时释放该对象,确保您的内存消耗保持在可接受的范围内。
因此,对于下采样算法,您要检查每个Realm对象,然后保存这些对象的子集,这样的事情将是一个合适的实现:
let realm = try! Realm()
let dataPoints = realm.objects(DataPoint.self)
var filteredPoints = [DataPoint]()
for index in 0..<dataPoints.count {
@autoreleasepool {
let dataPoint = dataPoints[index]
if LTTBBucket(dataPoint) {
filteredPoints.append(dataPoint)
}
}
}
至少应该关注内存消耗,但如果速度也是一个问题,那么将这个过滤卸载到后台线程可能是值得的。在这种情况下,您可以简单地将每个数据点的主键存储在一个数组中,并在完成后将其传递回主线程。