我需要批量加载表中的所有实体。 (它们需要在内存中而不是根据需要加载,以用于高速按需图形遍历算法。)
我需要将其并行化以便加载速度。所以,我想在并行线程中运行多个查询,每个查询都拉近。来自数据库的800个实体。
QuerySplitter用于此目的,但我们运行的是灵活环境,因此使用的是Appengine SDK而不是客户端库。
已经提到过MapReduce,但这不是针对简单的数据加载到内存中。 Memcache有点相关,但是对于高速访问,我需要在我自己的应用程序JVM的RAM中的密集网络中使用所有这些对象。
MultiQueryBuilder可能会这样做。它在并行运行部分查询时提供并行性。
使用这三种方法或其他方法中的哪一种,最难的部分是定义过滤器或一些其他形式的spilts,它们将表(Kind)粗略地划分为800个左右的实体块?我会创建过滤器,说"对象1到800"," 801到1600,...",但我知道这是不切实际的。那么,一个人怎么做呢?
答案 0 :(得分:1)
我通过将实体划分为随机组来解决类似的问题。
我为每个数据存储区实体添加了一个浮点属性,并在每次保存实体时为其分配一个0到1之间的随机数。然后,当启动N
个线程以对各种数据存储区实体进行工作时,我让每个线程都在1/N
个实体的查询上工作。例如,线程0将处理其随机属性设置在0
和1/N
之间的所有实体。线程2将处理在1/N
和2/N
等之间具有随机属性的所有实体。
这样做的缺点是它不完全是确定性的,您需要向数据存储区实体添加新属性。好处是它可以轻松扩展到数百万个实体和线程,并且通常可以在线程中均匀分配工作。