gpt4 book ai didi

python - 合并缓存的 GQL 查询而不是使用 IN

转载 作者:行者123 更新时间:2023-11-30 23:53:28 25 4
gpt4 key购买 nike

我正在生成一个合并许多用户评论的提要,因此您的提要可能是 user1+user2+user1000 的评论,而我的可能是 user1+user2。所以我有这样一句话:

some_comments = Comment.gql("WHERE username IN :1",user_list)

我不能只对整个内容进行内存缓存,因为每个人都会有不同的提要,即使 user1 和 user2 的提要对于许多查看者来说是常见的。根据the documentation :

...the IN operator executes a separate underlying datastore query for every item in the list. The entities returned are a result of the cross-product of all the underlying datastore queries and are de-duplicated. A maximum of 30 datastore queries are allowed for any single GQL query.

是否有一个库函数可以合并一些排序和缓存的查询,或者我必须:

for user in user_list
if memcached(user):
add it to the results
else:
add Comment.gql("WHERE username = :1",user) to the results
cache it too
sort the results

(在最坏的情况下(没有缓存任何内容),我预计发送 30 个 GQL 查询会比发送一个巨大的 IN 查询慢。)

最佳答案

没有任何内置功能可以执行此操作,但您可以自己执行此操作,但有一点需要注意:如果您执行 in 查询并返回 30 个结果,这些将是排序最低的 30 条记录根据您对所有子查询的排序标准。但是,如果您想从缓存的各个查询中组装结果集,那么您要么必须为每个用户缓存与总结果集一样多的结果(例如 30),然后丢弃大部分结果,要么您'我们必须为每个用户存储更少的结果,并接受有时您会丢弃一个用户的较新结果而选择另一个用户的较旧结果。

也就是说,您可以执行以下操作:

  1. 执行 memcache.get_multi 来检索所有用户的缓存结果集
  2. 对于每个没有缓存结果集的用户,执行单独的查询,获取您需要的最多结果。使用 memcache.set_multi 缓存结果集。
  3. 对所有结果集进行合并连接,并将前 n 个结果作为最终结果集。因为用户名可能不是列表字段(例如,每个评论都有一个作者),所以您无需担心重复。

目前,in 查询是串行执行的,因此即使没有缓存任何结果,此方法也不会比执行 in 查询慢。不过,这种情况将来可能会改变。如果您现在想提高性能,您可能需要使用 Guido 的 NDB项目,这将允许您并行执行所有子查询。

关于python - 合并缓存的 GQL 查询而不是使用 IN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5670397/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com