2

結果が数千件しかない場合、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();
    }
    ... ...
}

私が間違っていることは何ですか?

ありがとう、トニ

4

1 に答える 1

2

@toni を試すいくつかのこと。

  1. 40kの文字列/日付変換を節約する文字列の代わりにあなたDateを保存することを検討します。DATE_LONG
  2. @Selvinは、データベースを反復処理できる方法があれば、メモリ要件が低下し、速度が向上する可能性があるということです。ORMLite のdao.iterator ()を参照してください。
  3. プリミティブを使用intdoubleて、各オブジェクトの GC を下げますが、大きな違いがあるとは思えません。
  4. 1000 ポイント、10000 ポイント、20000 ポイントの順にロードして、ある時点でパフォーマンスが低下するかどうかを確認してください。これにより、メモリの制限に達していることがわかります。
  5. ユーティリティを使用してadb logcat、GC 時間を表示できるかどうかを確認し、コレクターを単にスラッシングしているかどうかを確認します。メモリ使用量を減らすためにできることは何でも役立ちます。次のような行を探します。
    GC_EXPLICIT は 114 ミリ秒で 4140 オブジェクト / 216560 バイトを解放しました
  6. それが問題だとは思いませんが、インデックスが欠落している可能性はありますか? index = true外部routeフィールド にa を追加してみてください。
于 2011-10-19T00:15:14.807 に答える