2

当有几千个结果时,通过 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();
    }
    ... ...
}

一些想法我做错了什么?

谢谢,托尼

4

1 回答 1

2

有几件事可以尝试@toni。

  1. 我会考虑将您存储Date为 aDATE_LONG而不是字符串,这将节省 40k 字符串/日期转换。
  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字段上添加一个。
于 2011-10-19T00:15:14.807 回答