2014-04-14 3 views
0

GAE 파이썬 앱에서 읽기 연산을 최적화하려고합니다. 내 무료 할당량을 초과하고 싶지 않습니다. 나는 기본적으로 데이터를 저장하고있다. 점점 많은 데이터가 중복 될 수 있으므로 저장하기 전에 확인해야합니다. 결과적으로 많은 읽기 연산과 일부 쓰기 연산이 발생합니다. 여기에 내가 지금하고있는 방법입니다 :Google App Engine NDB 읽기 연산 최적화

#data is a JSON data list with hundreds of items 
for item in data: 
    record = InfoDB.get_by_id(item['id']) 
    if record: 
    continue 
    else: 
    entity = InfoDB(id=item['id'], data=item['data']).put() 

여기는 읽기 작전을 낮추는 방법 중 하나입니다. 비록 그것이 사실이라면 나는 100 % 확실하지는 않지만. 루프가 반복 될 때마다 읽기 연산을 수행 할 수 있다고 생각합니다.

#data is a JSON data list with hundreds of items 
flag = False 
db = InfoDB.query().fetch() 
for item in data: 
    for record in db: 
    if record.id == item.id: 
     flag = True 

    if flag is True: 
    continue 
    else: 
    entity = InfoDB(id=item['id'], data=item['data']).put() 

위의 방법은 실제로는 본질적으로 전체 데이터 저장소를 잡는 이후 나 읽기 작업을 저장하고 다음 for 루프는 전체 세트마다 반복을 처리하기 위해 사용되어 있습니까? 나는 이것이 더 느리다는 것을 깨닫는다. 그러나 나는 이것을 어떻게 효율적으로 성취 할 수 있는지를 알지 못한다.

다른 아이디어?

편집 :

그냥 명확하게,이 NDB를 사용하고 있습니다. 이전 DB가 아닙니다.

답변

1

당신이 제안한 방법은 당신이 필요로하든 그렇지 않든간에 모든 엔티티를 읽으므로 더 많은 읽기 작업을 필요로합니다.

for key in query.iter(keys_only=True): 

키 - : 기존 엔티티를 오버라이드 (override) 할 수없는 경우, 당신은 keys-only query를 사용해야합니다

for item in data: 
    InfoDB(id=item['id'], data=item['data']).put() 

:

은 기존 개체를 대체 할 수 있다면 당신이 그것을 최적화하는 방법입니다 완전한 엔터티를 가져 오는 것과는 대조적으로 이제는 쿼리 만 사용 가능합니다.

+0

재미있는을한다. 나는 keys_only = True가 query()가 아니라 fetch()에 있어야 함을 발견했다. 즉, 쿼리 기반 돈 키를 수행하는 방법을 알 수 없습니다. 가장 가까운 것은'InfoDB.query (InfoDB._key == 'item ['id ']'). fetch (keys_only = True)'였습니다. 그러나 그것은 작동하지 않습니다. 이견있는 사람? –

+0

왜 키를 전달하고 키를 검색하려고합니까? –

+0

다음은 docs의 keys_only 쿼리에 대한 링크입니다. https://developers.google.com/appengine/docs/python/datastore/queries#Python_Keys_only_queries –

2

모든 키를 알고있는 경우 예제에서 모든 ID를 알고있는 entities = db.get([list of keys]) 또는 entities = ndb.get_multi([list of keys])을 수행하십시오.

이것은 훨씬 효율적입니다.

는 그런 다음 db.put(entities) 또는 ndb.put_multi(entities)

+0

그냥 확인하려면 NDB 용이고 이전 DB는 아니겠습니까? –

+0

아니, DB 용입니다. https://developers.google.com/appengine/docs/python/datastore/functions#get –

+0

doc을 읽은 다음 ndb와 동일한 ndb.get_multi 및 ndb.put_multi를 사용하십시오. - https://developers.google.com/appengine/docs/python/ndb/functions를 참조하십시오. –