AndroidのOrmliteDaoは、数千以上の結果をクエリすると非常に遅くなります

StackOverflow https://stackoverflow.com/questions/7811466

質問

数千の結果がある場合、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を試すためにいくつかのこと。

  1. 私はあなたを保管することを考えます Date として DATE_LONG 40kの文字列/日付変換を保存する文字列の代わりに。
  2. @selvinは、データベースを繰り返して何らかの方法がある場合、これによりメモリの要件が低下し、物事をスピードアップする可能性があることが正しいです。見る dao.iterator()ormlite.
  3. 私は使用します intdouble 各オブジェクトのGCを下げるためのプリミティブは、それが大きな違いをもたらすとは思いません。
  4. 1000ポイント、その後10000、その後20000でロードして、ある時点でパフォーマンスが低下しているかどうかを確認してください。それはあなたがメモリの制限にぶつかっていることをあなたに伝えます。
  5. 使用 adb logcat GC時間を見ることができるかどうかを確認して、コレクターを叩いているだけであるかどうかを確認できます。メモリの使用量を減らすためにできることはすべて役立ちます。次のような行を探してください:
    GC_EXPLICIT freed 4140 objects / 216560 bytes in 114ms
  6. 私はそれが問題であるとは思わないが、あなたはインデックスを見逃している可能性がありますか?を追加してみてください index = true 外国人 route 分野。
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top