2013-05-13 2 views
1

그래서이 코드는 "데이터 저장소 작은 작업"할당량을 초과 란?가 예기치 않게

위의 목록을 얻는 방법은 무엇입니까?

+0

알 수 있습니다. 문제는 국가가 독특하지 않다는 것입니다. 일부에는 1000 개의 항목이 있으므로 2 ~ 3 천 개가 아닌 1 백만 개의 항목이 있습니다. 국가를 먼저 가져 와서'countries = set ([i.country for all_nodes]) '세트에 넣은 다음 그걸로 필터링하면 효과가있었습니다. – timkofu

답변

1

GAE에서는 새 레코드를 작성할 때 각 국가의 합계를 추적하는 것이 더 나을 수 있습니다. 그렇다면 하나의 독서를 통해 국가 전체를 파악할 수 있습니다. 새 노드를 추가 할 때, 당신은 해당 Country 기록을 얻을하고 count 속성을 증가 할 수 있습니다, 그리고

class Country(db.Model): 
    name = db.StringProperty() 
    count = db.IntegerProperty() 

: 예를 들어, 새 모델 유형을 추가 할 수 있습니다.

예를 들어 all_nodes.filter(...)을 실행하면 n에 대한 새 쿼리가 all_nodes에 실행됩니다. 다음은 합계를 계산하는 더 저렴한 방법이어야합니다. 그러나 새 레코드를 작성할 때 국가 합계를 추적하는 것보다 비용이 많이들 것입니다. 인덱스에있는 모든 기록을 사용 count(limit=1) 또한 filter()이있는 경우

count()에서 사용 limit=n ( n = 당신이 감당할 수있는 최소한의)를
from collections import defaultdict 

country_nodes = defaultdict(int) 
for n in Nodes.query(): 
    country_nodes[n.country] += 1 
0

또는 예를 들어 fetch() 은 최소한의 count()을 수행 볼 수 있습니다. 대규모 레코드 데이터베이스에서 "Datastore Small Operations 할당량 초과"를 얻는 것은 매우 쉽습니다. 결과에있을 수있는 레코드 수에 대해 항상 생각하거나 내부적으로 인덱스되지 않은 방식으로 처리됩니다.

관련 문제