如何使用Google Datastore MultiQueryBuilder加载所有类型的实体?

时间:2016-05-17 14:34:08

标签: google-app-engine google-cloud-datastore google-managed-vm

我需要批量加载表中的所有实体。 (它们需要在内存中而不是根据需要加载,以用于高速按需图形遍历算法。)

我需要将其并行化以便加载速度。所以,我想在并行线程中运行多个查询,每个查询都拉近。来自数据库的800个实体。

QuerySplitter用于此目的,但我们运行的是灵活环境,因此使用的是Appengine SDK而不是客户端库。

已经提到过MapReduce,但这不是针对简单的数据加载到内存中。 Memcache有点相关,但是对于高速访问,我需要在我自己的应用程序JVM的RAM中的密集网络中使用所有这些对象。

MultiQueryBuilder可能会这样做。它在并行运行部分查询时提供并行性。

使用这三种方法或其他方法中的哪一种,最难的部分是定义过滤器或一些其他形式的spilts,它们将表(Kind)粗略地划分为800个左右的实体块?我会创建过滤器,说"对象1到800"," 801到1600,...",但我知道这是不切实际的。那么,一个人怎么做呢?

1 个答案:

答案 0 :(得分:1)

我通过将实体划分为随机组来解决类似的问题。

我为每个数据存储区实体添加了一个浮点属性,并在每次保存实体时为其分配一个0到1之间的随机数。然后,当启动N个线程以对各种数据存储区实体进行工作时,我让每个线程都在1/N个实体的查询上工作。例如,线程0将处理其随机属性设置在01/N之间的所有实体。线程2将处理在1/N2/N等之间具有随机属性的所有实体。

这样做的缺点是它不完全是确定性的,您需要向数据存储区实体添加新属性。好处是它可以轻松扩展到数百万个实体和线程,并且通常可以在线程中均匀分配工作。