Ormlite Dao в Android становится действительно медленным, когда запрос более нескольких тысяч результатов
-
26-10-2019 - |
Вопрос
Есть проблема с запросом данных через 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.
- Я бы подумал о хранении твоего
Date
какDATE_LONG
Вместо строки, которая сохранит 40K строки/конверсию даты. - @Selvin прав, что если есть какой -то способ для вас, вы можете выполнить через базу данных, это может снизить ваши требования к памяти и ускорить ситуацию. Видеть dao.iterator () в Ормлит.
- Я бы использовал
int
а такжеdouble
Примитивы, чтобы снизить ваш GC для каждого из ваших объектов, хотя я сомневаюсь, что это будет иметь большое значение. - Попробуйте загрузить в 1000 баллов, затем 10000, затем 20000, чтобы увидеть, есть ли в какой -то момент снижение производительности. Это скажет вам, что вы нажимаете по ограничениям памяти.
- Использовать
adb logcat
Утилита, чтобы увидеть, сможете ли вы увидеть время GC, чтобы увидеть, не просто бросаете коллекционер. Все, что вы можете сделать, чтобы снизить использование памяти, поможет тогда. Ищите линии, как:GC_EXPLICIT freed 4140 objects / 216560 bytes in 114ms
- Хотя я сомневаюсь, что это проблема, не могли бы вы пропустить индекс? Попробуйте добавить
index = true
на иностранномroute
поле.
Не связан с StackOverflow