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:举一个我们想要做的事情的例子:
- 假设我们有一个StockDerivative实体需要进行分析才能知道它是否是一项好的投资.
- 所执行的分析需要基于外部(例如,用户的偏好,市场条件)和内部(即来自实体的属性)的许多因素的复杂计算,并且将输出单个"投资得分"值.
- 用户可以根据其投资分数请求衍生品进行分类,并要求获得N个最高得分的衍生品.
最后,我们似乎无法在一秒内从单个实例检索 >2000 个实体,因此我们被迫使用后端实例上的内存缓存,如原始问题中所述。如果有人提出更好的答案,或者如果我们找到了针对此问题的更好的策略/实现,我将更改或更新已接受的答案。
| 归档时间: |
|
| 查看次数: |
1297 次 |
| 最近记录: |