2011-10-18 1 views
2

수천 개의 결과가있을 때 Ormlite DAO를 통해 데이터를 쿼리하는 데 문제가 있습니다.안드로이드의 Ormlite DAO가 수천 가지 이상의 결과를 쿼리 할 때 실제로 느려짐

코드 :

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

내가 40.000 점을 40 초처럼 기다릴 필요가 현재의 경로 croute에 대한 포인트 List<Point> pl의 큰 목록을 얻으려면

.

@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(); 
    } 
    ... ... 
} 

어떤 아이디어를 내가 잘못 뭘하는지 Point.class가

?

감사 사물의 토니

+0

일반 커서 사용 ... – Selvin

답변

2

커플 @toni 시도합니다.

  1. 내가 저장 생각 하는데요 당신의 Date 대신 40K 문자열/날짜 변환을 절약 할 문자열의 DATE_LONG있다.
  2. @Selvin은 데이터베이스를 반복 할 수있는 방법이 있으면 메모리 요구 사항이 낮아지고 작업 속도가 빨라질 수 있다고합니다. dao.iterator()ORMLite입니다.
  3. 각각의 개체에 대해 GC를 낮추기 위해 intdouble 프리미티브를 사용하면 많은 차이를 만들지는 모르겠다.
  4. 1000 포인트를로드 한 다음 10000을로드 한 다음 20000을로드하여 일부 지점에서 성능이 떨어지는 지 확인하십시오. 그것은 당신이 기억 한계에 부딪 치고 있다고 말할 것입니다.
  5. adb logcat 유틸리티를 사용하면 GC 시간을 볼 수 있는지 여부를 확인하여 수집기를 스 래싱하고 있는지 확인할 수 있습니다. 메모리 사용량을 줄이기 위해 할 수있는 일이면 도움이 될 것입니다. 다음과 같은 행을 찾으십시오.
    GC_EXPLICIT freed 4140 objects/216560 bytes in 114ms
  6. 나는 그것이 문제라고 생각하지만 색인을 누락시킬 수 있습니까? 외국 route 필드에 index = true을 추가하십시오.
+0

안녕하세요 @ 회색. 귀하의 제안을 구현하고 또한 dao.iterator()를 사용했지만 여전히 속도는 1k Points/sec입니다. 나는 로그 규모 (100100010000, ...)를 확인하고 큰 차이가 없다. 주석 변환에 문제가 있습니까? 원시 쿼리를 사용해야합니까? 고맙습니다. – toni

+0

이것은 DAO 작성시에만 발생하는 주석 변환이 아닙니다. GC 로그에서 무엇을 말 했나요? 그곳에 많은 시간을 보냈습니까? 내가 책상으로 돌아 왔을 때, 내가 무엇이 보이는지 알기 위해 대량 검사를 시도 할 것이다 ... – Gray

+0

4.3k 점의 로딩에서'GC_EXPLICIT 10K, 50 % free'를 한 번 보여 주지만 ... :'GC_CONCURRENT는 543K, 42 % 무료 4439K/7559K, 외부 0K/512K, 일시 중지 된 3ms + 11ms'의 모든 시간을 반복했습니다 ... 루핑 ... 고맙습니다. 그레이! – toni