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