2009-12-22 3 views
8

java appengine에 대한 새로운 실험적 작업 대기열을 사용 중이며 데이터 저장소에 통계를 집계하는 작업을 만들려고합니다. 내 데이터 저장소의 모든 권한 (특정 유형) 내에서 UNIQUE 값의 수를 계산하려고합니다. 더 구체적으로 말하면, 유형 X의 엔티티에는 필드 A가 있습니다. 데이터 스토어에있는 A의 고유 한 값 NUMBER를 계산하고 싶습니다.얼마나 큰 appengine 작업 페이로드가 될 수 있습니까?

나의 현재 접근법은 X의 첫 번째 10 개 엔티티를 쿼리하여 A의 고유 값을 저장하는 해시 테이블을 만든 다음이 해시 테이블을 페이로드로 다음 태스크에 전달하는 태스크를 만드는 것이다. 이 다음 작업은 모든 엔티티를 거칠 때까지 다음 10 개의 엔티티 등을 계산합니다. 마지막 작업을 실행하는 동안 해시 테이블에있는 키 수를 계산하여 (작업에서 작업으로 모두 전달됨) A의 고유 값의 총 수를 찾습니다.

내 데이터 저장소의 엔티티 수. 하지만 고유 값이 많으면이 해시 테이블이 너무 커질 까봐 걱정됩니다. appengine 작업의 페이로드에 허용되는 최대 크기는 무엇입니까 ?????

다른 방법을 제안 할 수 있습니까?

감사합니다.

답변

14

문서에 따르면, the maximum task object size is 100K.

+2

추위에 관한 사실. – Kredns

+0

오브젝트 크기 = 페이로드 크기입니까? – aloo

+4

개체를 어떻게 든 직렬화해야합니다. 그것이 페이로드입니다. 10k 이상이 될 것으로 예상된다면 실제 데이터를 포함하는 데이터 저장소 엔터티의 키를 직렬화하는 지연 라이브러리의 트릭을 사용할 수 있습니다. –

1

"대안을 제시 할 수 있습니까?"

값을 기반으로 키를 구성하고 Model.get_or_insert을 사용하여 각 고유 값에 대한 엔터티를 만듭니다. 그런 다음 Query.count의 엔티티를 1000 개 (또는 요청 시간이 초과되기 전에 셀 수있는 많은 수 - 10 개 이상) 정상적인 페이징 트릭을 사용하여 배치합니다.

또는 get_or_insert에 대한 문서에서 제공하는 코드와 비슷한 코드를 사용하여 App Engine 트랜잭션을 두 번 이상 실행할 수 있으므로 트랜잭션에서 증가하는 memcached 카운트가 신뢰할 수 없습니다. 그렇지만 엔티티 부모에게 너무 불쾌한 일을하지 않는다면 데이터 스토어에서 카운트를 유지할 수 있습니다.

0

이것은 너무 늦을 수도 있지만 아마도 유용 할 수 있습니다. 먼저 엔티티 집합을 순차적으로 살펴보고 싶을 때마다 인덱싱 된 date_created 또는 date_modified auto_update 필드를 사용하여 제안하십시오. 이 시점부터 json.dumps()를 사용하여 해시 테이블을 저장하는 TextProperty로 모델을 생성 할 수 있습니다. 마지막으로 처리 된 날짜와 해시 테이블 엔터티의 모델 ID를 전달하면됩니다. 마지막 날짜보다 나중에 date_created라는 쿼리를 실행하고 TextProperty 인 json_load()를 실행 한 후 다음 10 개의 레코드를 누적합니다. 조금 더 정교해질 수 있습니다 (예 : 전달 된 매개 변수와 약간 다른 쿼리 접근 방식을 사용하여 date_created 충돌을 처리합니다). 해시 테이블 엔티티를 너무 빨리 업데이트하는 문제를 피하려면 다음 작업에 1 초 카운트 다운을 추가하십시오. HTH, -stevep

관련 문제