我们的应用程序的某些部分需要加载大量数据(>2000 个实体)并在该数据集上执行计算。每个实体的大小约为 5 KB。
在我们最初的、幼稚的实现中,瓶颈似乎是加载所有实体所需的时间(2000 个实体约为 40 秒),而执行计算本身所需的时间非常短(<1 秒)。
我们尝试了几种策略来加快实体检索:
- 将检索请求拆分为多个并行实例,然后合并结果:~20 seconds for 2000 entity。
- 将实体存储在驻留后端的内存缓存中:约 5 秒用于 2000 个实体。
计算需要动态计算,因此在写入时进行预计算并存储结果在我们的情况下不起作用。
我们希望能够在一秒钟内检索到大约 2000 个实体。这在 GAE/J 的能力范围内吗?我们可以为这种检索实施任何其他策略吗?
更新:提供有关我们的用例和并行化结果的附加信息:
- 我们在数据存储区中有超过 200.000 个相同类型的实体,并且该操作仅用于检索。
- 我们用 10 个并行工作实例进行了实验,我们获得的典型结果可以在这个 pastebin中看到。将实体传输回主实例时所需的序列化和反序列化似乎会妨碍性能。
更新2:举例说明我们正在尝试做的事情:
- 假设我们有一个 StockDerivative 实体,需要对其进行分析以了解它是否是一项好的投资。
- 执行的分析需要基于许多外部因素(例如用户的偏好、市场状况)和内部因素(即来自实体的属性)的复杂计算,并且会输出一个单一的“投资得分”值。
- 用户可以请求根据其投资分数对衍生品进行排序,并要求提供 N 个得分最高的衍生品。