Orlite DAO в Android становится очень медленным при запросе более нескольких тысяч результатов

Возникла проблема с запросом данных через Ormlite DAO, когда результатов несколько тысяч.

Код:

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

Когда я хочу получить большой список очков List<Point> pl для текущего маршрута croute Я должен ждать 40 секунд за 40.000 баллов.

где 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();
    }
    ... ...
}

Некоторые идеи, что я делаю не так?

Спасибо Тони

1 ответ

Решение

Несколько вещей, чтобы попробовать @toni.

  1. Я хотел бы сохранить ваши Date как DATE_LONG вместо строки, которая сохранит 40 тыс. строк / преобразований даты.
  2. @ Селвин прав, что если есть какой-то способ перебора базы данных, это может снизить ваши требования к памяти и ускорить процесс. Смотрите dao.iterator() в ORMLite.
  3. Я бы использовал int а также double примитивы, чтобы понизить ваш GC для каждого из ваших объектов, хотя я сомневаюсь, что это будет иметь большое значение.
  4. Попробуйте загрузить в 1000 точек, затем в 10000, затем в 20000, чтобы увидеть, не падает ли производительность в какой-то момент. Это скажет вам, что вы бьете по ограничениям памяти.
  5. Использовать adb logcat утилита, чтобы увидеть, можете ли вы увидеть время GC, чтобы увидеть, если вы просто бьете коллектор. Все, что вы можете сделать, чтобы уменьшить использование памяти, поможет тогда. Ищите строки как:
    GC_EXPLICIT освободил 4140 объектов / 216560 байт за 114мс
  6. Хотя я сомневаюсь, что это проблема, не могли бы вы пропустить индекс? Попробуйте добавить index = true на иностранном route поле.
Другие вопросы по тегам