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

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 секунд за 40 000 баллов.

где точка. Класс:

@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 () в Ормлит.
  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 поле.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top