google-app-engine – 如何使用Google Datastore MultiQueryBuilder加载所有类型的实体?

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

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

QuerySplitter用于此目的,但我们在Flexible Environment上运行,因此使用Appengine SDK而不是Client库.

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

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

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

最佳答案 我通过将实体划分为随机组来解决类似的问题.

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

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

点赞