通过过滤谓词下采样算法?
Downsampling algorithms via filter predicates?
我得到的结果大约有 50k 个数据点,我想绘制图表,但点数比像素数多。因此,我想使用一些高性能且有意义的技术将 50k 条记录下采样到仅约 2,000 条记录。
将所有记录加载到内存中比 运行 对它进行算法需要几秒钟 运行 并且内存猛增一倍。
相反,我希望利用数据库进行下采样。是否可以将 largest triangle three buckets algorithm 之类的东西与过滤器谓词一起使用,这样我就可以将繁重的工作传递给数据库进行查询?
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)
}
}
}
至少应该解决内存消耗问题,但如果速度也是一个问题,则可能值得将此过滤卸载到后台线程。在这种情况下,您可以简单地将每个数据点的主键存储在一个数组中,并在完成后将其传回主线程。
我得到的结果大约有 50k 个数据点,我想绘制图表,但点数比像素数多。因此,我想使用一些高性能且有意义的技术将 50k 条记录下采样到仅约 2,000 条记录。
将所有记录加载到内存中比 运行 对它进行算法需要几秒钟 运行 并且内存猛增一倍。
相反,我希望利用数据库进行下采样。是否可以将 largest triangle three buckets algorithm 之类的东西与过滤器谓词一起使用,这样我就可以将繁重的工作传递给数据库进行查询?
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)
}
}
}
至少应该解决内存消耗问题,但如果速度也是一个问题,则可能值得将此过滤卸载到后台线程。在这种情况下,您可以简单地将每个数据点的主键存储在一个数组中,并在完成后将其传回主线程。