2009-07-10 2 views
0
내가 읽기 진행 상황을 기록하는 작은 프로그램을 쓰고 있어요

는 데이터 모델은 간단합니다 : 사용자가 날짜를 해당 읽을 얼마나 많은 페이지는 데이터 저장소 액세스 최적화

class BookState(db.Model): 
    isbn = db.StringProperty() 
    title = db.StringProperty(required=True) 
    pages = db.IntegerProperty(required=True) 
    img = db.StringProperty() 

class UpdatePoint(db.Model): 
    book = db.ReferenceProperty(BookState) 
    date = db.DateProperty(required=True) 
    page = db.IntegerProperty(required=True) 

UpdatePoint 클래스 기록합니다. 지금은 앱 엔진 데이터베이스에 저장된 데이터에서 차트를 그리려는, 함수는 다음과 같습니다

book = db.get(bookkey) 
ups = book.updatepoint_set 
ups.order('date') 

for (i, up) in enumerate(ups): 
    if i == 0: continue 

    # code begin 
    days = (up.date - ups[i-1].date).days 
    pages = up.page - ups[i-1].page 
    # code end 

    # blah blah 

나는 약 40 업데이트 점과 책, 그것은 4 초 이상 비용이 실행됩니다 것을 발견 코드. 타이밍이 끝나면 주석 처리 된 코드 스 니펫이 성능 저하의 근원 인 것 같습니다. 각 루프 비용은 약 0.08 초 이상입니다.

UpdatePoint는 필요한 때까지로드되지 않도록 게으른 방식으로 가져옵니다. 한 무리의 데이터를 가져 오는 것과 같이 데이터 액세스를 가속화하는 더 나은 솔루션이 있는지 여부를 알고 싶습니다.

답장을 보내 주셔서 감사합니다.

답변

3

잘못된 방식으로 Query 클래스를 사용한 것 같습니다. 먼저 ups.fetch()를 호출하여 데이터를 가져와야합니다. 이제 코드가 훨씬 빠르게 이전보다 : 코드의 모양에서

book = db.get(bookkey) 
q = book.updatepoint_set 
q.order('date') 
ups = q.fetch(50) 
+0

나는 당신이 지금까지 본 appengine 호출이 아니므로 updatepoint_set 함수가 할 수 있다고 생각했다. – AutomatedTester

+0

아마도 updatepoint_set은 참조를 사용할 때 자동으로 생성되는 백 레퍼런스입니까? http://code.google.com/appengine/docs/python/datastore/entitiesandmodels.html#References –

+1

젠장, 대답하기 전에 알아 냈어. ;) updatepoint_set은 Query 객체이며 인덱싱은 매번 쿼리를 새로 실행합니다. 한 번 가져 오는 것은 예상대로 배열을 제공합니다. –

0

, 당신의 느린 다운이 때문에 루프에 있고 좀 원하는 개체를 찾기 위해 튀어해야 할 것으로 보인다. 시도해 봤어?

i = 0 
for up in ups: 
    if i != 0: 
    days = (up.date - previous.date).days 
    pages = up.page - previous.page 
    i += 1 
    previous = up