我希望在我的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。
答案 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):
仅限密钥查询现在是免费的,而不是获取完整的实体。