2016-10-27 4 views
0

私はグラフ化したい約50kのデータポイントを持っていますが、それはピクセルより多くのポイントです。だから私は50kのレコードをパフォーマンスの高い、そして意味をなさないいくつかのテクニックを使って約2,000レコードにダウンサンプリングしたいと思っています。フィルタ述語によるアルゴリズムのダウンサンプリング?

アルゴリズムを実行するよりもすべてのレコードをメモリにロードすると、実行に数秒かかり、メモリショットは倍になります。

代わりに、データベースを活用してダウンサンプリングしたいと考えていました。フィルタ述語でlargest triangle three buckets algorithmのようなものを使用しているので、データベースに重いものを渡すことができます。

答えて

0

LTTBアルゴリズムは複雑すぎてNSPredicateクエリに組み込むことができません。私はそれが可能だとは思わない。

この複合体をクエリするには、データベースからデータを取り出して、手動で独自のアルゴリズムで処理するのが一番良いと思います。

レルムは、どのようにデータをメモリにプルするかで非常に効率的です。オブジェクトはそのプロパティに触れるときにのみページされます。その 'touch'を@autoreleaspoolに囲むと、そのオブジェクトがいつリリースされるかを制御して、メモリ消費が許容範囲内に保たれるようにすることができます。

ですから、一つ一つのレルムのオブジェクトをチェックしたが、その後、これらのオブジェクトのサブセットを保存しているダウンサンプリングアルゴリズムのために、このようなものは、適切な実装次のようになりますの世話をする必要があります

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) 
     } 
    } 
} 

メモリ消費量は最低ですが、速度にも問題がある場合は、このフィルタリングをバックグラウンドスレッドにオフロードする価値があります。この場合、各データポイントのプライマリキーを配列に格納し、完了したらメインスレッドに戻すことができます。

関連する問題