Orlite DAO в Android становится очень медленным при запросе более нескольких тысяч результатов - PullRequest
2 голосов
/ 18 октября 2011

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

Код:

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

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

где 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 Ответ

2 голосов
/ 19 октября 2011

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

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