1

저는 Google App Engine을 몇 달 동안 사용해 왔으며 최근에 Datastore와 관련된 일부 관행에 의문을 제기했습니다. 10-12 개의 속성이있는 엔티티가 약 10 개 있습니다. 모든 것은 내 응용 프로그램에서 잘 작동하며 코드는 구조화 된 방식으로 매우 직관적입니다. 그러나이 대형 엔터티를 읽기 및 쓰기 최적화 또는 모범 사례를 따르는 작은 엔터티로 분할해야하는지 궁금합니다. 나는 GAE와 관련하여 확신이 없습니다.)GAE 데이터 스토어 구조

지금은 읽고 쓰는 것에 대한 할당량을 초과 했으므로이를 확인하고 싶습니다.

답변

2

최적화 읽 읽는

  • 쿼리에서 오프셋을 사용하는 경우, 오프셋 기관이 계산됩니다. offset = 100 인 쿼리를 실행하면 데이터 스토어가 처음 100 개의 엔티티를 검색하여 버리고 해당 엔트리에 대해 요금이 청구됩니다. 가능하면 커서를 사용하여 읽기 작업을 줄이십시오. 또한 커서를 사용하면 더 빠른 쿼리를 생성 할 수 있습니다.

  • NDB는 쿼리를 실행할 때 반드시 읽기를 줄이지는 않습니다. 데이터 스토어에 대해 쿼리가 수행되고 엔티티가 반환되며 memcache 상호 작용은 발생하지 않습니다. 쿼리 컨텍스트에서 memcache에서 엔티티를 검색하려면 keys_only 쿼리를 실행 한 다음 memcache에서 해당 키를 검색해야합니다. 그런 다음 캐시 누락 인 모든 엔터티에 대해 데이터 저장소로 이동해야합니다. 키를 가져 오는 것은 읽기 연산 비용의 1/7 인 "작음"연산입니다.

최적화 쓴다

  • 사용되지 않는 인덱스를 제거합니다. 기본적으로 엔티티의 모든 속성은 색인이 생성되며 각각의 속성은 처음 작성 될 때 작성되고 수정 될 때마다 작성됩니다. firstname = db.StringProperty (indexed = False)와 같은 속성에 대한 색인 생성을 비활성화 할 수 있습니다.

  • 목록 속성을 사용하는 경우 목록의 각 항목은 항목의 개별 속성입니다. 목록 속성은 편의상 제공되는 추상화입니다.[ "thing1", "thing2"] 값을 가진 things라는 목록 속성은 실제로 데이터 저장소의 두 속성 인 things_0 = "thing1"및 things_1 = "things"입니다. 색인 생성과 결합하면 비용이 많이들 수 있습니다.

  • 쿼리 할 필요가없는 속성을 통합합니다. 하나 또는 두 개의 속성에 대해서만 쿼리하면되며, 나머지 속성은 직렬화하여 blob로 엔터티에 저장합니다.

추가 읽기 :

+0

추가 읽기 (답변에 두 개 이상의 링크를 게시 할 거리 신용이 없음) : https : //developers.google.com/appengine/docs/python/datastore/indexes#Indexes_and_Properties http://stackoverflow.com/questions/8113363/what-does-google-classify-as-a-datastore-write-operation -in-google-app-engine – ptevans

1

NDB Entities를 사용하는 것이 좋습니다. NDB는 Datastore에 대한 읽기/쓰기 작업을 수행하기 전에 컨텍스트 캐시 (및 필요한 경우 Memcache)를 사용합니다. 이렇게하면 할당량 내에 머물 수 있습니다. https://developers.google.com/appengine/docs/python/ndb/cache

그리고 GAE 관련하여 모범 사례에 대한 설명은이 페이지를 참조하십시오 : NDB 캐싱을 사용하는 방법에 대한 자세한 내용은 여기를 읽어

https://developers.google.com/appengine/articles/scaling/overview

+1

은 실제로 약 2 개월 전 NDB에 모든 것을 변환 확실히 차이를했다. 모범 사례에 대한 좋은 링크도 있습니다. – clifgray

1

하는 App Engine 데이터 저장소 엔터티 당 고정 금액을 청구 읽기 엔티티가 얼마나 큰 지 상관없이 (최대 1MB가 있지만). 즉, 함께 읽는 여러 항목을 하나의 항목으로 결합하는 것이 좋습니다. 단점은 지연 시간이 증가한다는 것입니다 (매번 큰 엔터티를 deserialize해야하기 때문에). 나는이 대기 시간이 아주 낮다는 것을 발견했다.

Datastore의 프레임 워크 ontop을 사용하는 것이 좋습니다. Objectify를 사용하고 매우 행복합니다. Memcache 통합을주의해서 사용하십시오. Google은 각 응용 프로그램에 고정 된 제한된 양의 메모리 만 제공하므로 큰 데이터에 대해 이야기하자마자 엔티티가 Memcache에서 제거되어 데이터 저장소에서 다시 읽고 캐시에 저장해야하므로 문제가 해결되지 않습니다. 각 읽기에 대해 다시).

+0

확인을 위해 대단히 감사드립니다. 예 memcache 제한 사항 중 일부를 알아 봤지만 전반적으로 큰 읽기 보호 기능이 있습니다. Objectify for Python과 같은 것을 아십니까? – clifgray

+0

아니요. 죄송합니다. 아무 것도 없으면 놀랄 것입니다. – Daniel

관련 문제