Google App Engine NDB读取操作优化

时间:2014-04-14 23:57:03

标签: python google-app-engine app-engine-ndb

我希望在我的GAE python应用程序中优化我的阅读操作。我不想超过我的免费配额。我基本上经常存储数据。我得到的很多数据可能会重复,所以我必须在存储之前检查它。这导致了许多读操作和一些写操作。以下是我现在的表现:

#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()

这是我想要降低读操作的一种方法。虽然我不是百分百肯定这是否属实。我认为每次循环迭代时它都可以执行读操作。

#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。

2 个答案:

答案 0 :(得分:2)

如果您知道所有密钥,请执行entities = db.get([list of keys])entities = ndb.get_multi([list of keys]) - 您可以从样本中了解所有密码。

效率更高。

然后执行db.put(entities)ndb.put_multi(entities)

答案 1 :(得分:1)

您提出的方法将导致更多的读取操作,而不是更少,因为现在您阅读所有实体,无论您是否需要它们。

如果您可以覆盖现有实体,则可以优化它:

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

如果您无法覆盖现有实体,则应使用keys-only query

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

仅限密钥查询现在是免费的,而不是获取完整的实体。