如何在1秒内从GAE数据存储中检索大量(> 2000)数量的实体?

Ibr*_*ief 11 java performance google-app-engine google-bigquery google-cloud-datastore

我们的应用程序的一部分需要加载大量数据(> 2000个实体)并在此集合上执行计算.每个实体的大小约为5 KB.

在我们最初的,天真的实现中,瓶颈似乎是加载所有实体所需的时间(2000个实体约为40秒),而执行计算所需的时间本身非常小(<1秒).

我们尝试了几种策略来加速实体检索:

  • 将检索请求拆分为多个并行实例,然后合并结果:2000个实体约20秒.
  • 将实体存储在驻留后端的内存缓存中:2000个实体约5秒.

计算需要动态计算,因此在写入时进行预计算并存储结果在我们的情况下不起作用.

我们希望能够在不到一秒的时间内检索出~2000个实体.这是否在GAE/J的能力范围内?我们可以为这种检索实现的任何其他策略?

更新:提供有关我们的用例和并行化结果的其他信息:

  • 我们在数据存储区中有超过200,000个相同类型的实体,并且操作仅检索.
  • 我们尝试了10个并行工作器实例,我们获得的典型结果可以在这个pastebin中看到.似乎将实体传回主实例时所需的序列化和反序列化会妨碍性能.

更新2:举一个我们想要做的事情的例子:

  1. 假设我们有一个StockDerivative实体需要进行分析才能知道它是否是一项好的投资.
  2. 所执行的分析需要基于外部(例如,用户的偏好,市场条件)和内部(即来自实体的属性)的许多因素的复杂计算,并且将输出单个"投资得分"值.
  3. 用户可以根据其投资分数请求衍生品进行分类,并要求获得N个最高得分的衍生品.

Ibr*_*ief 0

最后,我们似乎无法在一秒内从单个实例检索 >2000 个实体,因此我们被迫使用后端实例上的内存缓存,如原始问题中所述。如果有人提出更好的答案,或者如果我们找到了针对此问题的更好的策略/实现,我将更改或更新已接受的答案。