android - 数千を超える結果をクエリすると、AndroidのOrmlite DAOが非常に遅くなる

android performance dao ormlite

数千の結果がある場合、Ormlite DAOを介したデータのクエリに問題があります。

コード:

List<Point> pl = db.getPointsDAO().queryBuilder().where().
            eq("route_id", croute).query();


現在のルートList<Point> plのポイントcrouteの大きなリストを取得したい場合、40.000ポイントを40秒ほど待つ必要があります。

ここで、Point.classは次のとおりです。

@DatabaseTable(tableName = "points")
public class Point extends BaseEntity {
    @DatabaseField(generatedId = true)
    private Integer point_id;
    @DatabaseField(canBeNull = false)
    ...
    @DatabaseField(canBeNull = false)
    private Double dose;
    @DatabaseField(dataType=DataType.DATE_STRING, format="yyyy-MM-dd HH:mm:ss")
    public Date date;
    @DatabaseField(canBeNull=true,foreign=true)
    private Route route;

public Point() {
    super();
};
... ...
}


そしてRoute.classは:

@DatabaseTable(tableName = "routes")
public class Route extends BaseEntity {

    @DatabaseField(generatedId = true)
    private Integer route_id;

    @DatabaseField(canBeNull = true)
    private String name;

    @ForeignCollectionField(eager = false)
    ForeignCollection<Point> points;

    public Route() {
        super();
    }
    ... ...
}


私が間違っていることについていくつかのアイデア?

おかげで、
トニ
答え
@toniを試すためのいくつかのこと。


40kの文字列/日付変換を保存する文字列ではなく、DateとしてDATE_LONGを保存することを検討します。
@Selvinの言うとおり、データベースを反復処理する方法がある場合、これによりメモリ要件が低下し、処理速度が向上する可能性があります。 dao.iterator()ORMLiteを参照してください。
intdoubleのプリミティブを使用して、各オブジェクトのGCを下げますが、違いが大きくなるとは思えません。
1000ポイント、10000、20000の順にロードしてみて、ある時点でパフォーマンスが低下していないか確認してください。これにより、メモリ制限に達していることがわかります。
adb logcatユーティリティを使用して、コレクターをスラッシングしているだけかどうかを確認するためにGC時間を確認できるかどうかを確認します。あなたのメモリ使用量を減らすためにあなたができることは何でも助けになるでしょう。次のような行を探します:GC_EXPLICITが4140オブジェクトを解放/ 114ミリ秒で216560バイト
問題だとは思いますが、インデックスが不足していませんか?外部index = trueフィールドにrouteを追加してみてください。
関連記事

android - iPhoneまたはAndroidでUIプロトタイプを表示するためのアプリはありますか? [閉まっている]

android - android phonegap-<img src =“?”>に書き込むパスは?

android - 異なるサイズのアイコンをどこに置くか?

android - FileObserverでトースト通知を作成する

android - ImageViewのonDrawに関するロジック

java - 画面がタイムアウトしたときに、Activity onPauseメソッドが呼び出されますか?

android - 通知を長期間継続的に送信すると、Android通知バーのCPU使用率が増加する

android - TableViewのアイコンメニュー(Google+のような)

android - ユーザーがAndroidアプリで間違ったパスコード(ロック画面)を入力したかどうかを知る方法

android - 画面の向きを変更した後にブロードキャストレシーバーがクラッシュし、機能しない